hdu2066----------dijkstra模板题
这是一道多源点的dijkstra模板题,我整整做了一上午,交了14遍,过了4遍(呵呵,很疯狂啊!)
总的来说,收获颇丰。应该算完全掌握了这种算法。这是第一次过的代码,用的超级笨的方法,对每个起点和终点分别调用dij算法。
放在low[i][j] (代表第i个点到第j个点的最短距离) 中,最后再从low[i][j]找出最短的路径输出。 890ms过的。呵呵,很强,几乎没有比我更慢的啦!嘿嘿(不好意思) ,代码也很长。
AC:
#include<stdio.h>
#include<string.h>
#define inf 100000000
int map[1051][1051];
int s[1051];
int d[1051];
int from[1051]; //有s 个起点
int want[1051]; //有d 个终点
int low[1051][1051]; //low[i][j] 表示第i个点到第j 个点的最短路径
int dij(int v,int e) //起点v,终点e
{
int i,j,min,pos;
for(i=1;i<=1050;i++)
{
s[i]=0;
d[i]=map[v][i];
}
s[v]=1;
d[v]=0;
for(i=1;i<1050;i++)
{
min=inf;
for(j=1;j<=1050;j++)
{
if(!s[j]&&min>d[j])
{
pos=j;
min=d[j];
}
}
s[pos]=1;
if(pos==e||min==inf) break; //不要怀疑自己 ,这里没有错误! 我的思想是正确的
for(j=1;j<=1050;j++)
{
if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
d[j]=d[pos]+map[pos][j];
}
}
return d[e];
}
int main()
{
int t,s,d;
int i,j,k;
int a,b,time;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1050;i++)
{
for(j=1;j<=1050;j++)
{
map[i][j]=inf;
low[i][j]=inf;
}
}
//memset(map,100000000,sizeof(map));
//memset(low,100000000,sizeof(low));
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
{
if(map[a][b]>time) //这点很操蛋,没读清题意,WA了n多次!
map[a][b]=map[b][a]=time; //两个点之间可以有多条路,每次找最短边,输入地图中
}
}
for(i=1;i<=s;i++)
scanf("%d",&from[i]);
for(i=1;i<=d;i++)
scanf("%d",&want[i]);
for(i=1;i<=s;i++)
{
for(j=1;j<=d;j++) //我的方法很笨,对每个点调用dij,所以就很耗时间
{ //说明对dij算法 还不是很清楚。
//事实上,对每个起点调用dij算法,就得到了所有结果了
low[i][j]=dij(from[i],want[j]);
}
}
k=inf;
for(i=1;i<=s;i++)
{
for(j=1;j<=d;j++)
{
if(k>low[i][j])
k=low[i][j];
}
}
printf("%d\n",k);
}
return 0;
}