uva10099 (floyd & 最大生成树)
2016-03-10 19:27
316 查看
题目大意:
有一个导游,要将游客从城市i送到城市j,有的城市之间是有公交车可以直达的,但是公交车是有限制人数的。问导游需要多少趟才能把所有的游客从城市i送到城市j。
思路:
其实这道题说白了就是算从城市i到j的路径当中,要找出一条路径的最小值是所有路径最小值当中最大的。
floyd算法:
d[i][j] = max(d[i][j],min(d[i][k],d[k][j]));
kruskal算法:
将城市之间的公交车的限载人数作为权值从大到小排序形成一个优先级队列。然后不断的添加边,直到可以将城市i,j连接起来,这时候这个权值就是要求的,即最小值中的最大值。
代码:
floyd算法:
kruskal算法:
有一个导游,要将游客从城市i送到城市j,有的城市之间是有公交车可以直达的,但是公交车是有限制人数的。问导游需要多少趟才能把所有的游客从城市i送到城市j。
思路:
其实这道题说白了就是算从城市i到j的路径当中,要找出一条路径的最小值是所有路径最小值当中最大的。
floyd算法:
d[i][j] = max(d[i][j],min(d[i][k],d[k][j]));
kruskal算法:
将城市之间的公交车的限载人数作为权值从大到小排序形成一个优先级队列。然后不断的添加边,直到可以将城市i,j连接起来,这时候这个权值就是要求的,即最小值中的最大值。
代码:
floyd算法:
#include <iostream> using namespace std; #include <cstring> #include <stdio.h> #include <cmath> #include <algorithm> const int N = 105; const int INF = 0x3f3f3f3f; int n,m,start,e,limit,d ; void floyd() { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int k = 1; k <= n; k++) { int temp = min(d[j][i],d[i][k]); if(d[j][k] == INF) d[j][k] = temp; else d[j][k] = max(d[j][k],temp); } } } } int main() { int T = 0; while(scanf("%d %d",&n,&m) && n && m) { for(int i = 1; i <= n; i++){ d[i][i] = 0; for(int j = i + 1; j <= n; j++) d[i][j] = d[j][i] = INF; } int a,b,c; for(int i = 0; i < m; i++) { scanf("%d %d %d",&a,&b,&c); d[a][b] = d[b][a] = c; } floyd(); scanf("%d %d %d",&start,&e,&limit); int ans = d[start][e]; // printf("%d",ans); if(limit %(ans - 1) == 0) { ans = limit/(ans - 1); } else ans = limit/(ans - 1) + 1; printf("Scenario #%d\n",++T); printf("Minimum Number of Trips = %d\n\n",ans); } return 0; }
kruskal算法:
#include <iostream> using namespace std; #include <cstring> #include <stdio.h> #include <cmath> #include <algorithm> const int N = 10005; int n,m,start,e,limit,f ; struct node { int u,v,w; friend bool operator < (const node &a,const node &b) { return a.w > b.w; } }arr ; int find(int x) { int i,j,k = x; while(k != f[k]) k = f[k]; i = x; while(i != k) { j = f[i]; f[i] = k; i = j; } return k; } bool Union(int i,int j) { int x = find(i); int y = find(j); if(x == y) return false; else f[x] = y; return true; } int main() { int x,y,w; int T = 0; while(scanf("%d %d",&n,&m) && n && m) { for(int i = 0; i <= n; i++) f[i] = i; for(int i = 0; i < m; i++) { scanf("%d %d %d",&arr[i].u,&arr[i].v,&arr[i].w); } sort(arr,arr + m); scanf("%d %d %d",&start,&e,&limit); int i; for(i = 0; i < m; i++) { if(Union(arr[i].u,arr[i].v)) { int a = find(start); int b = find(e); if(a == b) break; } } printf("Scenario #%d\n",++T); int ans = arr[i].w; if(limit %(ans - 1) == 0) ans = limit /(ans - 1); else ans = limit /(ans - 1) + 1; printf("Minimum Number of Trips = %d\n\n",ans); } return 0; }
相关文章推荐
- 半透明div并且在IE火狐下兼容
- memset函数与二维数组初始化的问题
- Java多线程
- YTU C语言习题 整数排序
- uiautomator日志文件转换为xml格式文件
- IDL format codes
- java 实现文件复制demo
- Linux Shell 编程学习总结
- 字符串包含 位运算法
- 理解互斥量和信号量
- 导入百度导航SDK遇到的相关问题
- scatter file介绍
- Cocoapods
- 架构师的行为准则(四)
- 我是一只IT小小鸟读后感
- 页面展示方法和装置
- init&initWithFrame&initWithCoder
- docker学习笔记15:Dockerfile 指令 USER介绍
- Recover the Smallest Number (30)
- javascript时间戳转换为date类型