标签:hdu2680 最短路径 dijkstra choose the best rout
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
尽管条件很艰苦,尽管今天是大年三十,我还是在努力。
这题如果直接Dijkstra的话,多次求单源最短路径,会超时,但是我只要设置一个超级源点0,0到各个起点的距离为0,到其他各点距离为INF。就完美解决了!是不是很巧妙
另外该图是无向图。自己到自己也是INF
下面是代码:
#include <stdio.h> #include <string.h> #define MAX 1010 #define INF 100000000 int dis[MAX] , graph[MAX][MAX] ; bool closed[MAX] ; void dijkstra(int u , int n) { for(int i = 1 ; i <= n ; ++i) { dis[i] = graph[u][i] ; closed[i] = false ; } closed[u] = true ; for(int i = 1 ; i <= n ; ++i) { int min = INF , index = 0 ; for(int j = 1 ; j <= n ; ++j) { if(!closed[j] && dis[j]<min) { min = dis[j]; index = j ; } } if(min == INF) { break ; } closed[index] = true ; for(int j = 1 ; j <= n ; ++j) { if(graph[index][j] == INF) { continue ; } if(dis[j]>dis[index] + graph[index][j]) { dis[j] = dis[index] + graph[index][j] ; } } } } int main() { int n , m ,s; while(~scanf("%d%d%d",&n,&m,&s)) { for(int i = 0 ; i <= n ; ++i) { for(int j = 0 ; j <= i ; ++j) { graph[i][j] = graph[j][i] = INF ; } } for(int i = 0 ; i < m ; ++i) { int x,y,w; scanf("%d%d%d",&x,&y,&w); if(graph[x][y] > w) { graph[x][y] = w ; } } int ans = INF , q ; scanf("%d",&q) ; for(int i = 0 ; i < q ; ++i) { int u ; scanf("%d",&u); graph[0][u] = 0; } dijkstra(0,n) ; ans = ans<dis[s]?ans:dis[s] ; if(ans == INF) { puts("-1") ; } else { printf("%d\n",ans) ; } } return 0 ; }
有志者,事竟成。破釜沉舟,百二秦关终属楚。
苦心人,天不负。卧薪尝胆,三千越甲可吞吴。
hdu 2680 Choose the best route 大年三十的首A 赤裸裸的Dijkstra 做这题需要一个小技巧
标签:hdu2680 最短路径 dijkstra choose the best rout
原文地址:http://blog.csdn.net/lionel_d/article/details/43877169