文章

25

粉丝

0

获赞

27

访问

1.4k

头像
继续畅通工程 题解:Kruskal
P1311 浙江大学机试题
发布于2026年2月22日 15:52
阅读数 42

#include <bits/stdc++.h>
using namespace std;
const int maxn=105;

struct edge{
    int u,v,w;
}edges[maxn*maxn];
bool compare(edge a,edge b){
    return a.w<b.w;
}

int fa[maxn];
int find(int x){
    if(x==fa[x]) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}

int n,m,t;
int main(){
    while(cin>>n&&n!=0){
        m=n*(n-1)/2;
        int sum=0;
        for(int i=1;i<=n;i++){
            fa[i]=i;
        }
        for(int i=0;i<m;i++){
            cin>>edges[i].u>>edges[i].v>>edges[i].w>>t;
            if(t==1)
                edges[i].w=0;
        }
        sort(edges,edges+m,compare);
        for(int i=0;i<m;i++){
            int fx=find(edges[i].u);
            int fy=find(edges[i].v);
            if(fx!=fy){
                fa[fy]=fx;
                sum+=edges[i].w;
            }
        }
        cout<<sum<<endl;
    }
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发