poj 2066 一个人的旅行(多源最短路)
来源:互联网 发布:柯洁 知乎 编辑:程序博客网 时间:2024/06/05 21:53
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
这道题是一道简单的多源最短路, 但是需要进行优化, 不然会超时的。正好借这道题,把多源最短路,总结一下, 并把优化的和未优化的都写下来, 进行比较记忆下。
在floyd算法中, 求最短路, 其实就是暴力搜索, 但是在初始化时, dp[i][i] = 0;其他的都为INF, 但是我们最后发现只有两点间没有连通dp的值就为INF, 而我们要求的是最小值, 如果一个数加上INF肯定不会对最小值有影响, 所以我们可以根据这点就行优化,我们只对值为0~INF之间的进行松弛操作就可以得到最小值。根据这个思想,我们还可以对初始值进行优化, 把初始值全部都赋值为INF, 而我们只对dp值不为INF的进行松弛操作就可以了。
这是为优化的(本道题的超时代码)
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1000 + 10;const int INF = 100000000;int dp[maxn][maxn];bool start[maxn], end[maxn];int mm, time;void inin(){ for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) dp[i][j] = i==j? 0 : INF; mm = 0; time = INF; memset(start, 0, sizeof(start)); memset(end, 0, sizeof(end));}int main(){ int n, m, k, a, b, t, s, d; while(~scanf("%d%d%d", &n, &m, &k)) { inin(); for(int i = 0; i < n; i++) { scanf("%d%d%d", &a, &b, &t); if(dp[a][b] > t) dp[a][b] = t; dp[b][a] = dp[a][b]; int c; if(a>b) c = a; else c = b; if(c > mm) mm = c; } for(int i = 0; i < m; i++) { scanf("%d", &s); start[s] = true; } for(int i = 0; i < k; i++) { scanf("%d", &d); end[d] = true; } for(int e = 1; e <= mm; e++) for(int i = 1; i <= mm; i++) for(int j = 1; j <= mm; j++) { if(dp[i][j] > dp[i][e]+dp[e][j]) dp[i][j] = dp[i][e]+dp[e][j]; if(start[i] && end[j] && time>dp[i][j]) time = dp[i][j]; } printf("%d\n", time); } return 0;}这是经过优化的(AC代码)
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1000 + 10;const int INF = 100000000;int dp[maxn][maxn]; //存储i.j间的最短路bool start[maxn], end[maxn]; //标记哪些是起点和终点int mm, time;void inin(){ for(int i = 0; i < maxn; i++) //起始时两点之间的最短为无穷大 for(int j = 0; j < maxn; j++) dp[i][j] = INF; mm = 0; time = INF; memset(start, 0, sizeof(start)); memset(end, 0, sizeof(end));}int main(){ int n, m, k, a, b, t, s, d; while(~scanf("%d%d%d", &n, &m, &k)) { inin(); for(int i = 0; i < n; i++) { scanf("%d%d%d", &a, &b, &t); if(dp[a][b] > t) dp[a][b] = t; dp[b][a] = dp[a][b]; int c; if(a>b) c = a; else c = b; if(c > mm) mm = c; } for(int i = 0; i < m; i++) { scanf("%d", &s); start[s] = true; } for(int i = 0; i < k; i++) { scanf("%d", &d); end[d] = true; } for(int e = 1; e <= mm; e++) for(int i = 1; i <= mm; i++) if(dp[i][e] != INF) //i.e之间连通才能用 { for(int j = 1; j <= mm; j++) { if(dp[i][j] > dp[i][e]+dp[e][j]) dp[i][j] = dp[i][e]+dp[e][j]; if(start[i] && end[j] && time>dp[i][j]) time = dp[i][j]; } } printf("%d\n", time); } return 0;}
0 0
- poj 2066 一个人的旅行(多源最短路)
- poj 2066 一个人的旅行 最短路 迪杰斯特拉和弗洛伊德
- hdu 2066 一个人的旅行 (多源最短路 )
- hdu 2066 一个人的旅行 (多源最短路 Floyd)
- HDOJ 2066 一个人的旅行(Dijstra 类似多源最短路)
- HDU 2066 一个人的旅行 (多源最短路)
- HDU-2066 一个人的旅行 最短路
- hdu 2066 一个人的旅行(最短路)
- hdoj 2066 一个人的旅行 【多源多汇最短路】
- HDOJ-2066-一个人的旅行(最短路)
- hdu 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行(最短路)
- HDU - 2066- 一个人的旅行【最短路】
- 最短路 一个人的旅行
- HDU 2066 一个人的旅行(最短路的简单题)
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- hdu 2066 一个人的旅行(Dijkstra求最短路问题)
- hdu 2066 一个人的旅行(最短路问题)
- 网络流图形简化
- JME2 和JME3的比较
- 我想成为的DBA或者想招到的DBA
- 算法训练 操作格子 (线段树)
- Android开发基础之Eclipse单元测试
- poj 2066 一个人的旅行(多源最短路)
- Android Studio 和 JDK 安装
- 【SICP练习】99 练习2.75
- nyoj 42 一笔画问题
- visual c++开发时创建的类怎么删除?
- 【SICP练习】100 练习2.76
- 运算符重载之先加和后加++以及【】的运用
- orcale数据库和vs2013安装
- 九宫格布局