hdu2680
简单dijkstra,给了起点集合,一个终点。求起点到终点的最短距离。 n个点,(1..........n)。设置一个虚拟起点0,虚拟起点到起点集合的距离都是0,然后就用模板,以0为起点,求出到终点的最短距离。 本来是抱着轻松愉悦的心情来刷他的,结果一个超级恶心的第几错误让我找了半个小时。
好吧,以后,出现莫名其妙是WA就给我一句句的看代码。最终肯定会找出该死的bug
AC:
#include<stdio.h>
#include<string.h>
#define inf 100000000
int map[1010][1010]; //注意这道题是单向边, 而且我设置 0 为虚拟起点
int d[1010];
int s[1010];
int n,m,ss; //s是终点
int dij(int v)
{
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++) //处理剩余的n 个点
{
min=inf;
for(j=1;j<=n;j++)
{
if(!s[j]&&min>d[j])
{
pos=j;
min=d[j];
}
}
if(pos==ss||min==inf) break; //*******************************
s[pos]=1;
for(j=1;j<=n;j++)
{
if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
d[j]=d[pos]+map[pos][j];
}
}
return d[ss];
}
int main()
{
int i,j,k;
int p,q,t;
int w,qi; //qi代表起点
while(scanf("%d%d%d",&n,&m,&ss)!=EOF)
{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=inf;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&t);
if(map[p][q]>t) //tmd,你就在这儿坑爹吧 ,什么垃圾错误。只有想不到,没有错不到
map[p][q]=t; //代码风格很不严谨
}
scanf("%d",&w);
for(i=1;i<=w;i++)
{
scanf("%d",&qi);
map[0][qi]=0;
}
k=dij(0);
if(k==inf) printf("-1\n");
else
printf("%d\n",k);
}
return 0;
}