HDU 2066 一个人的旅行 (floyd算法)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2066

思路:求有多个起点和多个终点,找出从其中任意一个起点到任意一个终点的距离最短,用floyd算法,但是要注意很多细节的优化,要不会超时

借鉴代码如下:

 1 #include<cstdio>
 2  #include<cstring>
 3  #include<cstdlib>
 4  #define inf 0x3fffffff
 5  int map[1001][1001],max;
 6  bool start[1001],end[1001];
 7  int floyd()
 8  {
 9      int i,j,k,min=inf;
10      for(i=1;i<=max;++i)
11          for(j=1;j<=max;++j)
12              if(map[j][i]!=inf)
13              {
14                  for(k=1;k<=max;++k)
15                  {
16                      map[j][k]=map[j][k]<map[j][i]+map[i][k]?map[j][k]:map[j][i]+map[i][k];
17                      if(start[j]&&end[k]&&min>map[j][k])   //j是起点而且k是终点,则直接找最小值
18                          min=map[j][k];
19                  }
20              }
21      return min;
22  }
23  
24  int main()
25  {
26      int t,s,d,i,j,a,b,time,tmp;
27      while(scanf("%d%d%d",&t,&s,&d)!=EOF)
28      {
29          max=0;
30          for(i=1;i<=1000;++i)
31              for(j=1;j<=1000;++j)
32                  map[i][j]=inf;
33          for(i=1;i<=t;++i)
34          {
35              scanf("%d%d%d",&a,&b,&time);
36              max=max>a?max:b;       //max记录最大的城市编号,减小floyd计算量
37              max=max>b?max:b;
38              map[a][b]=map[b][a]=map[a][b]<time?map[a][b]:time;
39          }
40          memset(start,false,sizeof(start));
41          memset(end,false,sizeof(end));
42          for(i=0;i<s;++i)
43          {
44              scanf("%d",&tmp);
45              start[tmp]=true;  //start数组用来标记是否是起点
46          }
47          for(i=0;i<d;++i)
48          {
49              scanf("%d",&tmp);
50              end[tmp]=true;   //end数组用来标记是否是终点
51          }
52          printf("%d\n",floyd());
53      }
54      return 0;
55  }

posted on 2012-08-22 10:30  mycapple  阅读(1858)  评论(0编辑  收藏  举报

导航