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;
}

posted on 2012-03-21 20:36  hrbust_09zhangyabin  阅读(588)  评论(0编辑  收藏  举报