hdu2680(最短路径问题)
这个最短路径问题好,刚开始一直TLE,看了别人的结题报告后,突然感觉是自己笨了,不知道,灵活运用了,这道题用到了一个虚拟节点的问题
本题中起始点有多个,如果按照正常的方法来做的话,可能要循环多次,求不同起点的最小值,这样时间就会话费的多些,采用虚拟节点后,把这个点到每个起始点的距离都设置为0,当有某个点到其余的点有相同的最短路径是,任选一条即可,这题就是运用的这点知识,好啊
1 #include<stdio.h> 2 #include<string.h> 3 #define inf 100000000 4 int map[1010][1010]; //注意这道题是单向边 5 int d[1010]; 6 int s[1010]; 7 int n,m,ss; //ss是终点 8 int dij(int v) 9 { 10 int i,j,min,pos; 11 for(i=0;i<=n;i++) 12 { 13 s[i]=0; 14 d[i]=map[v][i]; 15 } 16 //s[v]=1; 17 //d[v]=0; 18 for(i=1;i<=n;i++) //处理剩余的n 个点 19 { 20 min=inf; 21 for(j=1;j<=n;j++) 22 { 23 if(!s[j]&&min>d[j]) 24 { 25 pos=j; 26 min=d[j]; 27 } 28 } 29 if(pos==ss||min==inf) break; 30 s[pos]=1; 31 for(j=1;j<=n;j++) 32 { 33 if(!s[j]&&d[j]>(d[pos]+map[pos][j])) 34 d[j]=d[pos]+map[pos][j]; 35 } 36 } 37 return d[ss]; 38 } 39 int main() 40 { 41 int i,j,k; 42 int p,q,t; 43 int w,qi; //qi代表起点 44 while(scanf("%d%d%d",&n,&m,&ss)!=EOF) 45 { 46 for(i=0;i<=n;i++) 47 for(j=0;j<=n;j++) 48 map[i][j]=inf; 49 for(i=1;i<=m;i++) 50 { 51 scanf("%d%d%d",&p,&q,&t); 52 if(map[p][q]>t) 53 map[p][q]=t; 54 } 55 scanf("%d",&w); 56 for(i=1;i<=w;i++) 57 { 58 scanf("%d",&qi); 59 map[0][qi]=0; // 设置虚拟的点0 ,O到起点的距离为0,这样就直接一遍dijkstra就行了。 60 } 61 k=dij(0); 62 if(k==inf) printf("-1\n"); 63 else 64 printf("%d\n",k); 65 } 66 return 0; 67 }
时间果然很少啊……