USACO section3.1 Agri-Net题解&代码

hhh…最后发现数组开小了【炸毛】…
我的一个小时!一个小时啊魂淡!
浪费在这道裸最小生成树上!
我去冷静一会再交下一道…

/* ID:rainbow16 LANG:C++ TASK:agrinet */
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node { int x,y,d; };
node r[10025];
int fa[1000],m[105][105],n,ans,cou=0;
void init(void)
{
    for(int i=1;i<1000;i++)
        fa[i]=i;
}
int fin(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=fin(fa[x]);
}
void unio(int x,int y)
{
    if(fin(x)!=fin(y))
        fa[fin(x)]=fin(y);
}
bool cmp(node a,node b)
{
    return a.d<b.d;
}
int main(void)
{
    freopen("agrinet.in","r",stdin);
    freopen("agrinet.out","w",stdout);
    init();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&m[i][j]);
            if(i<j)
            {
                r[cou].x=i;
                r[cou].y=j;
                r[cou++].d=m[i][j];
            }
        }
    sort(r,r+cou,cmp);
    for(int i=0;i<cou;i++)
        if(fin(r[i].x)!=fin(r[i].y))
        {
            unio(r[i].x,r[i].y);
            ans+=r[i].d;
        }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(C++,USACO)