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 做这题需要一个小技巧
原文:http://blog.csdn.net/lionel_d/article/details/43877169