http://acm.hdu.edu.cn/showproblem.php?pid=2680
这个题,好艰辛。咳咳。 是一道多个起点,一个终点的最短路问题。
最初用Floyd交了回,超时了。1000的立方过亿了,用Floyd就会超时。
后来又笨笨的写了笨笨的dijkstra, 还是超时了。
后来又改进了dijkstra。出现了WA。原因 是这个题他居然是个有向图啊。~~
后来改成有向图,终于出现了AC...
#include <iostream>
using namespace std;
#define N 1003
#define INF 0x7ffffff
int map[N][N],dir[N];
bool visited[N];
void dijkstra(int s,int e,int n){
int i,j,low,t;
for (i=0;i<=n;i++){
dir[i]=map[s][i];
visited[i]=false;
}
dir[s]=0;
visited[s]=true;
for (i=1;i<=n;i++){
low=INF;
for (j=0;j<=n;j++)
if (!visited[j]&&dir[j]<low){
low=dir[j];
t=j;
}
if (low==INF)
break;
visited[t]=true;
for (j=0;j<=n;j++)
if (!visited[j]&&dir[t]+map[t][j]<dir[j])
dir[j]=dir[t]+map[t][j];
}
if (dir[e]<INF)
printf("%d\n",dir[e]);
else printf("-1\n");
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2680in.txt","r",stdin);
#endif
int n,m,s,w,i,j,p,q,t;
while (scanf("%d%d%d",&n,&m,&s)!=EOF){
for (i=0;i<=n;i++)
for (j=0;j<=n;j++)
map[i][j]=INF;
for (i=0;i<m;i++){
scanf("%d%d%d",&p,&q,&t);
if (t<map[p][q]) //记住这里啊,是有向图。
map[p][q]=t;
}
scanf("%d",&w);
t=INF;
for (i=0;i<w;i++){
scanf("%d",&p); //有多个起点的最短路,用0作为起点,然后原起点到0的距离设为0.
map[0][p]=map[p][0]=0;
}
dijkstra(0,s,n);
}
return 0;
}