您的位置:首页 > 运维架构

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: