ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

黑暗城堡

2019-07-29 10:51:16  阅读:241  来源: 互联网

标签:房间 黑暗 int 城堡 路径 long dis


黑暗城堡

时间限制: 1 Sec  内存限制: 128 MB

题目描述

你知道黑暗城堡有N个房间(1≤N≤1000),M条可以制造的双向通道,以及每条通道的长度。
城堡是树形的并且满足下面的条件:如果所有的通道都被修建,设D[i]为第i号房间与第1号房间的最短路径长度;而S[i]为实际修建的树形城堡中第i号房间与第1号房间的路径长度;要求对于所有整数i(1≤i≤N),有S[i]=D[i]成立。
你想知道有多少种不同的城堡修建方案。当然,你只需要输出答案对231-1取模之后的结果就行了。

样例输入

4 6
1 2 1
1 3 2
1 4 3
2 3 1
2 4 2
3 4 1

样例输出

6

最短路径树SPT(Short Path Tree)是网络的源点到所有结点的最短路径构成的树。那么本题就是相求有多少颗以1为源点的最短路径树。那么可以先求出每个点的入边中,有多少条是最短路径上的边,再考虑按照最短路径大小升序依次访问这些点,当我们访问到某种状态时,需要拓展下一个点,那么这个点的入边在最短路径上的边都可以成为我们拓展的边,于是答案乘上这个边数。
#include<bits/stdc++.h>
using namespace std;
const int N =1005;
const long long mod=(1ll<<31) - 1;
 
struct ss
{
    int u,v,w,next;
};
ss edg[N*N];
int head[N],sum_edge=0;
 
void addedge(int u,int v,int w)
{
    edg[sum_edge]=(ss){u,v,w,head[u]};
    head[u]=sum_edge++;
}
 
priority_queue<pair<long long,int> >q;
int vis[N]={0};
long long dis[N];
 
void dij(int S)
{
    for(int i=0;i<N;i++)dis[i]=LLONG_MAX/2;
    dis[S]=0;
    q.push(make_pair(0,S));
 
    while(q.size())
    {
        int x=q.top().second;
        q.pop();
 
        if(vis[x])continue;
        vis[x]=1;
 
        for(int i=head[x];i!=-1;i=edg[i].next)
        {
            int v=edg[i].v;
            if(dis[v]>dis[x]+edg[i].w)
            {
                dis[v]=dis[x]+edg[i].w;
                q.push(make_pair(-dis[v],v));
            }
        }
    }
}
 
int main()
{
    memset(head,-1,sizeof(head));
    int n,m;
    scanf("%d %d",&n,&m);
    while(m--)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        addedge(u,v,w);
        addedge(v,u,w);
    }
 
    dij(1);
 
 
 
    long long ans=1;
    long long cnt[N]={0};
    pair<long long ,int >arr[N];
    for(int i=1;i<=n;i++)
    {
        arr[i].first=dis[i];
        arr[i].second=i;
    }
 
    sort(arr+1,arr+1+n);
 
    for(int i=1;i<=n;i++)
    {
        int x=arr[i].second;
 
        for(int j=head[x];j!=-1;j=edg[j].next)
        {
            int v=edg[j].v;
            if(dis[v]==dis[x]+edg[j].w)cnt[v]++;
        }
        ans*=max(cnt[x],1ll);
        ans%=mod;
    }
 
    printf("%lld\n",ans);
    return 0;
 
 
}
View Code

 

标签:房间,黑暗,int,城堡,路径,long,dis
来源: https://www.cnblogs.com/tian-luo/p/11262654.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有