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 }