题目链接:
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1197
注意事项:
1.初始数组长度为零
2.同样路径可能花费不同的时间
3.运用变形的Dijkstra算法
代码思路:
先初始化二维数组e和cot再输入数据并更新二维数组e和最大的cot,接着输入能到达的点fly并把e[fly][0]和e[0][fly]初始化为0,最后输入想要到达的f,然后运用Dijkstra算法得出到达各点的最短路数组,最后找出最短路数组的最小值ans。
代码如下:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #define inf 1<<30 6 using namespace std; 7 8 int e[1205][1205]; 9 int a,b,t,n,m,l,cot,ans,fly[1205],f[1205],book[1205],dis[1205]; 10 int dsj() 11 { 12 int u,pos; 13 memset(book,0,sizeof(book)); 14 book[0]=1; 15 for(int i=0;i<=cot;i++) 16 dis[i]=e[i][0]; 17 for(int i=1;i<=cot;i++) 18 { 19 pos=inf; 20 for(int j=1;j<=cot;j++) 21 { 22 if(dis[j]<pos&&book[j]==0) 23 { 24 pos=dis[j];u=j; 25 } 26 } 27 book[u]=1; 28 for(int v=1;v<=cot;v++) 29 { 30 if(!book[v]&&dis[v]>dis[u]+e[u][v]) 31 dis[v]=dis[u]+e[u][v]; 32 } 33 } 34 return 0; 35 } 36 int main() 37 { 38 while(~scanf("%d%d%d",&n,&m,&l)) 39 { 40 cot=0; 41 for(int i=0;i<1111;i++) 42 { 43 for(int j=0;j<1111;j++) 44 e[i][j]=inf; 45 e[i][i]=0; 46 } 47 for(int i=0;i<n;i++) 48 { 49 scanf("%d%d%d",&a,&b,&t); 50 if(t<e[a][b]) 51 e[a][b]=e[b][a]=t; 52 if(cot<a||cot<b) 53 cot=a>b?a:b; 54 } 55 for(int i=0;i<m;i++) 56 { 57 scanf("%d",&fly[i]); 58 e[fly[i]][0]=e[0][fly[i]]=0; 59 } 60 for(int i=0;i<l;i++) 61 scanf("%d",&f[i]); 62 dsj(); 63 ans=inf; 64 for(int i=0;i<l;i++) 65 if(ans>dis[f[i]]) 66 ans=dis[f[i]]; 67 if(ans==inf) 68 printf("NO "); 69 else 70 printf("%d ",ans); 71 } 72 return 0; 73 }