NYOJ 115

简介:   城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

 

城市平乱

时间限制: 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

数据保证暴乱的城市是可达的。
输出
对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
样例输入
1
3 8 9 8
1 2 3
1 2 1
2 3 2
1 4 2
2 5 3
3 6 2
4 7 1
5 7 3
5 8 2
6 8 2 
样例输出
4
#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #define MAX 0x7FFFFFFF
 #define N 1005
 int cls[N],map[N][N],vis[N],city[101],ans[101];
 int m,n,p,q;
 /*V为源点 */ 
 void Dijkstra(int v)
 {
     int i,j,min,next;
     /* 先用v到邻接点的距离初始化cls */
     for(i=1;i<=m;i++)    
	 	cls[i]=map[v][i];
     memset(vis,0,sizeof(vis));
     vis[v]=1;//起点访问标志置1
     for (i=1;i<m;i++)//无等号 
     {
         min=MAX;
         next=v;
         /*找出离集合最近的那个点next,以及该点到集合的距离min*/
         for (j=1;j<=m;j++)
         {
             if(!vis[j]&&cls[j]<min)
             {
                 next=j;
                 min=cls[j];
             }
         }
         vis[next]=1;
         for (j=1;j<=m;j++)
         {
         	/*j点没有被访问过,j点和next点之间有通路,next点到j点的距离+集合到nxt的距离<集合到j的距离*/
             if(!vis[j]&&map[next][j]<MAX&&(min+map[next][j])<cls[j])
                 cls[j]=cls[next]+map[next][j];
         }
     }
 }
 int main()
 {
     int T,i,j;int a,b,c;int temp;
     scanf("%d",&T);
     while(T--)
     {
     	temp=0x7FFFFFFF;
     	for(i=0;i<N;i++)
         	for(j=0;j<N;j++)
         		map[i][j]=MAX;
     	scanf("%d%d%d%d",&n,&m,&p,&q);
     	/*	部队驻扎点 */ 
     	for(i=1;i<=n;i++)
     		scanf("%d",city+i);
         while(p--)
         {
             scanf("%d%d%d",&a,&b,&c);
             if(map[a][b]>c)    
			 	map[a][b]=map[b][a]=c;
         }
         for(i=1;i<=n;i++)
         	{
         		memset(cls,0,sizeof(cls));
			 	Dijkstra(city[i]);
 				ans[i]=cls[q];
 				//printf("%d     %d       %d\n",cls[q],ans[i],cls[n]);
         	}
    	for(i=1;i<=n;i++)
			if(temp>ans[i])
				temp=ans[i];
		printf("%d\n",temp);	
     }
     return 0;
 }
 /*
 error: invalid types `int[int]' for array subscript
 变量和数组同名 
 */ 

 

目录
相关文章
|
7月前
|
算法
NYOJ-448-寻找最大数
NYOJ-448-寻找最大数
31 0
|
人工智能 算法
|
网络协议
NYOJ 8
  一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.
794 0
NYOJ 93
  汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
601 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0
NYOJ 212
  K尾相等数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。
624 0
|
人工智能 BI
NYOJ 45
1 // 结果超过了long long,到32就超了 2 #include 3 #include 4 using namespace std; 5 long long fun(int a,int b) 6 { 7 //if(0==b) 8 ...
593 0
|
人工智能
NYOJ 104(最大子矩阵和)
  此代码在全为-2时,输出0,显然错误,因为函数下标从0开始,而传递的参数希望他从1开始 #include#include int a[101][101],b[10010];int subsequencesum(int a[],int n){ int sum=0,maxsum=0,i; f...
607 0