hdu1874--------畅通工程续
简单的dijkstra模板题。很简单,找一个起点到终点的最短路径。10几分钟就敲好代码了。一交,WA! 无语
看了disscus,被指点有重边。查,又是重边这个玩意儿。搞什么,读题真读不出来! 然后筛选了一下重边,就AC了。
还有一点啊,就是起点等于终点时,要输出0,别输出inf了。
其中,我加了一个剪枝条件,if(pos==e||min==inf) break; 完全正确,而且时间从15ms 提高到了0 ms。(高兴)
AC:
#include<stdio.h>
#define inf 100000000
int map[210][210];
int d[210];
int s[210];
int n,m;
int ss,tt;
int dij(int v,int e)
{
int i,j,min,pos;
for(i=0;i<n;i++)
{
s[i]=0;
d[i]=map[v][i];
}
s[v]=1;
d[v]=0;
for(i=1;i<n;i++)
{
min=inf;
for(j=0;j<n;j++)
{
if(!s[j]&&min>d[j])
{
pos=j;
min=d[j];
}
}
s[pos]=1;
if(pos==e||min==inf) break;
for(j=0;j<n;j++)
{
if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
d[j]=d[pos]+map[pos][j];
}
}
return d[e];
}
int main()
{
int i,j,k;
int a,b,x;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]=inf;
for(i=0;i<n;i++)
map[i][i]=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&x);
if(x<map[a][b])
map[a][b]=map[b][a]=x;
}
scanf("%d%d",&ss,&tt);
k=dij(ss,tt);
if(k==inf)
printf("-1\n");
else
printf("%d\n",k);
}
return 0;
}
浙公网安备 33010602011771号