NYOJ 115 城市平乱 【无向图 + 链式前向星 + SPFA】

来源:互联网 发布:php重载 编辑:程序博客网 时间:2024/06/01 10:27

城市平乱

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。

他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。

现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。

注意,两个城市之间可能不只一条路。

输入
第一行输入一个整数T,表示测试数据的组数。(T<20)
每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部队数,M表示城市数,P表示城市之间的路的条数,Q表示发生暴乱的城市编号。
随后的一行是N个整数,表示部队所在城市的编号。
再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路如果行军需要用时为t

数据保证暴乱的城市是可达的。
输出
对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
样例输入
13 8 9 81 2 31 2 12 3 21 4 22 5 33 6 24 7 15 7 35 8 26 8 2 
样例输出
4

/*
用链式前向星建无向图,SPFA求各顶点间的距离。 
*/

#include<cstdio>#include<cstring>#include<queue>#define inf 0x3f3f3f3fusing namespace std;const int maxn=1010;const int maxm=100002;int n,cnt,head[maxn],dis[maxn],vis[maxn],city[maxn];struct node{    int to,w,next;}edge[maxm];void init(){    memset(head,-1,sizeof(head));    cnt=0;    }void addedge(int i,int j,int w){    edge[cnt].to=j;    edge[cnt].w=w;    edge[cnt].next=head[i];    head[i]=cnt++;} void spfa(int s){    for(int i=1; i<=n; i++){        dis[i]=inf;        vis[i]=0;    }    dis[s]=0,vis[s]=1;    queue<int>q;    q.push(s);    while(!q.empty()){        int x=q.front();        q.pop();        vis[x]=0;        for(int k=head[x]; k!=-1; k=edge[k].next){            int t=edge[k].to;            if(dis[t]>dis[x]+edge[k].w){                dis[t]=dis[x]+edge[k].w;                if(!vis[t]){                    vis[t]=1;                    q.push(t);                }            }        }    }}int main(){    int T,m,p,q,a,b,t,i,ans;    scanf("%d",&T);    while(T--){        scanf("%d %d %d %d",&p,&n,&m,&q);//这里p是部队数,n是城市数,m是边数,q是发生暴动的城市         init();        for(i=0; i<p; i++){            scanf("%d",&city[i]);        }        while(m--){            scanf("%d %d %d",&a,&b,&t);            addedge(a,b,t);            addedge(b,a,t);        }        spfa(q);        for(i=0,ans=inf; i<p; i++){            if(ans>dis[city[i]])                 ans=dis[city[i]];        }        printf("%d\n",ans);    }    return 0;}









0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子2个月吃奶老是呛到怎么办 孩子4个月不好好吃奶怎么办? 3个月的孩子不吃奶肚子胀怎么办 刚出生的婴儿吃完奶打嗝怎么办 宝宝刚生下来一直睡觉不吃奶怎么办 刚生下来的婴儿不吃奶怎么办 刚生下来的小猫不吃奶怎么办 刚生的小羊羔不吃奶怎么办 刚出生的婴儿不会吸奶怎么办 生完小孩七十天妈妈咳嗽怎么办 带欣的名字三个字儿的怎么办 二十多岁的儿子沉迷游戏网络怎么办 为什么打开游戏网络却用不了怎么办 打来微信网页版显示证书错误怎么办 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办 江西银行网银密码忘了怎么办 广发信用卡网银密码忘了怎么办 刚注册的淘宝账号买不了东西怎么办 隐藏后的wif不知道用户名怎么办