361. 连接农场 Agri-Net(挑战程序设计竞赛)

题目链接:https://www.papamelon.com/problem/361;

今天最后一道mst,明天再战;

Talk is cheap. Show me the code.

#include<bits/stdc++.h>
using namespace std;
const int num=1e4+10;
int s[110];
struct edge
{
    int u;
    int v;
    int w;
}e[num];
int cnt;
int ans;
int n;
bool cmp(edge a,edge b)
{
    return a.w<b.w;
}
int find(int x)
{
    if(x!=s[x])
    s[x]=find(s[x]);
    return s[x];
}
void kruskal()
{
    int t=0;
    for(register int i=1;i<=n;i++)
    s[i]=i;
    sort(e+1,e+1+cnt,cmp);
    for(register int i=1;i<=cnt;i++)
    {
        int b=find(e[i].u);
        int c=find(e[i].v);
        if(b==c)
        continue;
        s[c]=b;
        ans+=e[i].w;
        t++;
        if(t==n-1)
        break;
    }
    
}
int main()
{
    std::ios::sync_with_stdio(false);
    while(~scanf("%d",&n))
{
    ans=0;
    cnt=0; for(register int i=1;i<=n;i++) { for(register int j=1;j<=n;j++) { int temp; cin>>temp; if(temp) { e[++cnt].u=i; e[cnt].v=j; e[cnt].w=temp; } } } kruskal(); cout<<ans<<endl;
}
return 0; }

 

posted @ 2022-04-30 19:51  江上舟摇  阅读(15)  评论(0编辑  收藏  举报