nyoj 115 城市平乱

来源:互联网 发布:githubpages运行js 编辑:程序博客网 时间:2024/05/16 19:37

城市平乱

时间限制: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
思路:对于每个部队都作为起点进行最短路,求出最小的!
   代码:
      
 #include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define  inf 100000000#define  ac 1100int map[ac][ac],dist[ac],visit[ac],s[ac];int army,city,road,fire,start;int dijkstra(int start){int mindist,next;int i,j;memset(visit,0,sizeof(visit));for(i=1;i<=city;i++){dist[i]=map[start][i];}visit[start]=1;for(i=2;i<=city;i++)  {  mindist=inf;  for(j=1;j<=city;j++)   {   if(visit[j]==0&&dist[j]<mindist)   {   mindist=dist[j];   next=j;} } visit[next]=1; for(j=1;j<=city;j++) { if(visit[j]==0&&dist[next]+map[next][j]<dist[j]) dist[j]=dist[next]+map[next][j]; }  }  return dist[fire];}int main(){int a,n,b,t,m;int i,j;int dis[1100];scanf("%d",&n);while(n--){scanf("%d%d%d%d",&army,&city,&road,&fire); for(i=1;i<=city;i++)  for(j=1;j<=city;j++)      {      map[i][j]=inf;      if(i==j)       map[i][j]=0;  }  for(i=1;i<=army;i++)   {   scanf("%d",&s[i]);   }      for(i=1;i<=road;i++)       {       scanf("%d%d%d",&a,&b,&t);       if(map[a][b]>t)       map[a][b]=map[b][a]=t;   }  for(i=1;i<=army;i++)   {     dis[i]=dijkstra(s[i]);//将每个部队用的时间存储起来!        }       m=inf;      for(i=1;i<=army;i++)//进行一一比较!        {         if(dis[i]<m)         {         m=dis[i];  }   }   printf("%d\n",m);    }}        

0 0
原创粉丝点击