HDU 2066 一个人的旅行 (floyd算法)
2012-08-22 10:30
309 查看
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2066
思路:求有多个起点和多个终点,找出从其中任意一个起点到任意一个终点的距离最短,用floyd算法,但是要注意很多细节的优化,要不会超时
借鉴代码如下:
思路:求有多个起点和多个终点,找出从其中任意一个起点到任意一个终点的距离最短,用floyd算法,但是要注意很多细节的优化,要不会超时
借鉴代码如下:
#include<cstdio> #include<cstring> #include<cstdlib> #define inf 0x3fffffff int map[1001][1001],max; bool start[1001],end[1001]; int floyd() { int i,j,k,min=inf; for(i=1;i<=max;++i) for(j=1;j<=max;++j) if(map[j][i]!=inf) { for(k=1;k<=max;++k) { map[j][k]=map[j][k]<map[j][i]+map[i][k]?map[j][k]:map[j][i]+map[i][k]; if(start[j]&&end[k]&&min>map[j][k]) //j是起点而且k是终点,则直接找最小值 min=map[j][k]; } } return min; } int main() { int t,s,d,i,j,a,b,time,tmp; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { max=0; for(i=1;i<=1000;++i) for(j=1;j<=1000;++j) map[i][j]=inf; for(i=1;i<=t;++i) { scanf("%d%d%d",&a,&b,&time); max=max>a?max:b; //max记录最大的城市编号,减小floyd计算量 max=max>b?max:b; map[a][b]=map[b][a]=map[a][b]<time?map[a][b]:time; } memset(start,false,sizeof(start)); memset(end,false,sizeof(end)); for(i=0;i<s;++i) { scanf("%d",&tmp); start[tmp]=true; //start数组用来标记是否是起点 } for(i=0;i<d;++i) { scanf("%d",&tmp); end[tmp]=true; //end数组用来标记是否是终点 } printf("%d\n",floyd()); } return 0; }
相关文章推荐
- hdu 2066 一个人的旅行 优化的Floyd算法解决
- HDU 2066 一个人的旅行
- hdu-2066-一个人的旅行
- HDU 2066 一个人的旅行
- hdu-2066 一个人的旅行(最短路spfa)
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行 (SPFA + 链式前向星)
- HDU 2066 一个人的旅行 Floyd
- hdu 2066 一个人的旅行(优先队列 dijkstr)
- (*)hdu 2066 一个人的旅行(Dijkstra)
- HDU 2066-一个人的旅行(Dijkstra)
- hdu 2066 一个人的旅行【Dijkstra】解法
- hdu 2066 一个人的旅行 (Dijkstra算法)
- HDU 2066 一个人的旅行.
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行(dijkstra)
- hdu 2066 一个人的旅行(Dijkstra求最短路问题)
- hdu 2066 一个人的旅行(最短路径 Dijkstra算法)
- hdu 2066一个人的旅行(多源最短路径Floyd)