标签:
输出草儿能去某个喜欢的城市的最短时间。
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
9
1 #include<cstdio> 2 #include<algorithm> 3 #include<string.h> 4 #define INF 0xfffffff 5 using namespace std; 6 int max0,map[10100][10100],flag[1010],len[1010]; 7 void f1() 8 { 9 int i,j; 10 memset(flag,0,sizeof(flag)); //对标记数组清零 11 flag[0]=1; 12 for(i = 1 ; i <= max0 ; i++) 13 { 14 len[i]=map[0][i]; //len[i]表示0节点到i节点的距离 15 } 16 for(i = 0 ; i < max0 ; i++) 17 { 18 int M=INF,k=-1; 19 for(j = 1 ; j <= max0 ; j++) 20 { 21 if(!flag[j] && len[j] < M) 22 { 23 M=len[j]; //找出距离0节点最近的点 24 k=j; 25 } 26 } 27 flag[k]=1; 28 for(j = 1 ; j <= max0 ; j++) 29 { 30 if(!flag[j] && len[j] > len[k]+map[k][j]) 31 { 32 len[j]=len[k]+map[k][j]; //比较0节点到j节点的距离与0节点到k节点再到j节点的距离记录小的值 33 } 34 } 35 } 36 } 37 int main() 38 { 39 int t,s,d,i,j,x,a,b,c; 40 while(scanf("%d %d %d",&t,&s,&d)!=EOF) 41 { 42 for(i = 0 ; i <= 1001 ; i++) //i的范围可能大于1000,所以上限要大于1000 43 { 44 for(j = 0 ; j <= 1001 ; j++) 45 { 46 map[i][j]=INF; //初始i到j的距离 47 } 48 } 49 max0=0; 50 for(i = 0 ; i < t ; i++) //输入城市的关系 51 { 52 scanf("%d %d %d",&a,&b,&c); 53 if(map[a][b] > c) 54 { 55 map[a][b]=map[b][a]=c; 56 } 57 max0=max(max0,max(a,b)); //记录最大的城市号 58 } 59 max0++; 60 for(i = 0 ; i < s ; i++) 61 { 62 scanf("%d",&x); 63 map[0][x]=0; //令0为起点,起点到邻近城市的距离设为0 64 } 65 for(i = 0 ; i < d ; i++) 66 { 67 scanf("%d",&x); 68 map[x][max0]=0; //令max0为终点,终点到想去的城市距离为0 69 } 70 f1(); 71 printf("%d\n",len[max0]); 72 } 73 74 }
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5738465.html