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;
}
posted @ 2021-10-31 13:27  Rekord  阅读(438)  评论(0编辑  收藏  举报