UVa 10048 - Audiophobia
2012-11-06 21:16
357 查看
模拟kruskal的过程,一条边一条边的加入树中,每加入一次,就判断起点和终点是否在一个集合里, 一旦他们在一个集合里了,那么那条路径中的最大值便是当前加入的这条边的权值,因为加入的边是按照从小到大顺序加入的。
代码如下:
代码如下:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; const int DMAXN = 105; const int EMAXN = 1005; int c, s, q, x, y, val; int p[DMAXN], u[EMAXN], v[EMAXN], r[EMAXN], dis[EMAXN]; int cmp(const int i, const int j) { return dis[i] < dis[j]; } int find(int i) { return p[i] == i ? i : (p[i] = find(p[i])); } void Kruskal() { int px, py; for(int i=1; i<=c; i++) p[i] = i; for(int i=0; i<s; i++) { int e = r[i]; int xx = find(u[e]); int yy = find(v[e]); if(xx != yy) p[xx] = yy; px = find(x); // 查找x的根 py = find(y); // 查找y的根 if(px == py) // 两个根相同了,则说明两个点联通了 { val = dis[e]; return ; } } } int main() { #ifdef test freopen("sample.txt", "r", stdin); #endif int fx, fy, wi, ff = 0, t = 0; while(scanf("%d%d%d", &c, &s, &q)) { if(!c && !s&& !q) break; if(ff) puts(""); for(int i=0; i<s; i++) { scanf("%d%d%d", &fx, &fy, &wi); u[i] = fx; v[i] = fy; dis[i] = wi; r[i] = i; } sort(r, r+s, cmp); printf("Case #%d\n", ++t); for(int i=0; i<q; i++) { val = -1; scanf("%d%d", &x, &y); Kruskal(); if(val > 0) printf("%d\n", val); else printf("no path\n"); } ff = 1; } return 0; }
相关文章推荐
- uva 10048 Audiophobia(floyd)
- UVA 10048 - Audiophobia(floyd)
- uva 10048 - Audiophobia(floyd 的变形)
- UVa 10048 - Audiophobia(floyd算法)
- UVA - 10048 Audiophobia floyd的变形
- UVA 10048 - Audiophobia(flody算法应用)
- uva 10048 - Audiophobia(floyd 的变形)
- Audiophobia UVA - 10048
- UVa 10048 - Audiophobia
- PC/UVa 110903/10099 The Tourist Guide & UVa 10048 Audiophobia
- UVa10048 Audiophobia
- uva 10048 Audiophobia floyd的变形
- UVA 10048 Audiophobia
- UVA 10048 Audiophobia(Floyd算法)
- UVa 10048 Audiophobia(Floyed变形)
- Uva10048——Audiophobia
- UVA - 10048 Audiophobia (Floyd算法)
- 噪音恐惧症(Audiophobia,UVa10048)——floyd变形,最大最小化
- Uva - 10048 - Audiophobia(Floyd)
- uva10048 - Audiophobia()