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

 

posted on 2012-03-20 18:37  hrbust_09zhangyabin  阅读(172)  评论(0)    收藏  举报