您的位置:首页 > 其它

poj 1861

2013-08-18 15:09 169 查看
刚开始没懂样例,看了discuss才知道.这个题就是考Kruskal.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 99999999
const int maxn = 1010;
using namespace std;
struct edge{
int l,r,w;
}ee[maxn*maxn/2];
int map[maxn][maxn],rt[maxn],path[maxn][2];
int nedge;
bool flag[maxn];
bool Cmp(edge a, edge b) {return a.w < b.w;}
void Build(int n){
for(int i = 1; i <= n; ++i)
rt[i] = i;
}
int Find(int x){
if(rt[x] == x) return x;
return Find(rt[x]);
}
void Union(int x,int y){
int rt1 = rt[x];
int rt2 = rt[y];
if(rt1 != rt2)
rt[rt1] = rt2;
}
void Kruskal(int n){
int rt1,rt2;
int k = 0,ans = -1;
for(int i = 0; i < nedge; ++i){
rt1 = Find(ee[i].l);
rt2 = Find(ee[i].r);
if(rt1 != rt2){
Union(rt1,rt2);
path[k][0] = ee[i].l;
path[k][1] = ee[i].r;
k++;
if(ans < ee[i].w) ans = ee[i].w;
if(k == n) break;
}
}
printf("%d\n%d\n",ans,n-1);
for(int i = 0; i < k; ++i)
printf("%d %d\n",path[i][0],path[i][1]);
}
int main()
{
int n;
while(~scanf("%d",&n)){
Build(n);
int m;
scanf("%d",&m);
nedge = 0;
while(m--){
int a,b,len;
scanf("%d %d %d",&a,&b,&len);
ee[nedge].l = a;
ee[nedge].r = b;
ee[nedge].w = len;
nedge++;
}
sort(ee,ee+nedge,Cmp);
Kruskal(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kruskal