1348:【例4-9】城市公交网建设问题
原来这叫Kruskal算法!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=105;
struct edge{
int u,v,w;
}edg[N*N];
int fa[N];
int cmp(edge x,edge y){
return x.w<y.w;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
int n,e;
cin>>n>>e;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=e;i++){
scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].w);
if(edg[i].u>edg[i].v)swap(edg[i].u,edg[i].v);//迎合输出
}
sort(edg+1,edg+e+1,cmp);
// Kruskal算法
for(int i=1;i<=e;i++){
int t1=find(edg[i].u),t2=find(edg[i].v);
if(t1==t2)continue;//说明二者已连通
fa[t2]=t1;
printf("%d %d\n",edg[i].u,edg[i].v);
}
return 0;
}