hdu2680(最短路径问题)

这个最短路径问题好,刚开始一直TLE,看了别人的结题报告后,突然感觉是自己笨了,不知道,灵活运用了,这道题用到了一个虚拟节点的问题

本题中起始点有多个,如果按照正常的方法来做的话,可能要循环多次,求不同起点的最小值,这样时间就会话费的多些,采用虚拟节点后,把这个点到每个起始点的距离都设置为0,当有某个点到其余的点有相同的最短路径是,任选一条即可,这题就是运用的这点知识,好啊

 1  #include<stdio.h>
 2  #include<string.h>
 3  #define inf 100000000
 4  int map[1010][1010];               //注意这道题是单向边
 5  int d[1010];
 6  int s[1010];
 7  int n,m,ss;                //ss是终点
 8  int dij(int v)
 9  {
10      int i,j,min,pos;
11      for(i=0;i<=n;i++)
12      {
13          s[i]=0;
14          d[i]=map[v][i];
15      }
16      //s[v]=1;
17      //d[v]=0;
18      for(i=1;i<=n;i++)         //处理剩余的n 个点
19      {
20          min=inf;
21          for(j=1;j<=n;j++)
22          {
23             if(!s[j]&&min>d[j])
24                 {
25                  pos=j;
26                  min=d[j];
27                }
28           }
29          if(pos==ss||min==inf) break;
30          s[pos]=1;
31          for(j=1;j<=n;j++)
32          {
33               if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
34              d[j]=d[pos]+map[pos][j];
35          }
36      }
37      return d[ss];
38  }
39  int main()
40  {
41  int i,j,k;
42  int p,q,t;
43  int w,qi;          //qi代表起点
44  while(scanf("%d%d%d",&n,&m,&ss)!=EOF)
45  {
46      for(i=0;i<=n;i++)
47      for(j=0;j<=n;j++)
48      map[i][j]=inf;
49        for(i=1;i<=m;i++)
50      {
51          scanf("%d%d%d",&p,&q,&t);
52          if(map[p][q]>t)
53          map[p][q]=t;
54      }
55      scanf("%d",&w);
56      for(i=1;i<=w;i++)
57      {
58          scanf("%d",&qi);
59          map[0][qi]=0;            // 设置虚拟的点0 ,O到起点的距离为0,这样就直接一遍dijkstra就行了。
60      }
61      k=dij(0);
62      if(k==inf) printf("-1\n");
63      else
64      printf("%d\n",k);
65   }
66   return 0;
67  }

时间果然很少啊……

posted on 2012-08-15 10:33  矮人狙击手!  阅读(488)  评论(0编辑  收藏  举报

导航