poj 1258 agri-net


题目大意:

最小生成树裸题

思路:

直接kruskal

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int ans,a,k,n,f[10202];
struct edg
{
    int x,y,dis;
    bool operator < (const edg &a) const
    {
        return dis<a.dis;
    }
}edge[10202];
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}//并查集
bool ok(int a,int b)//判断两个点是否已经连通
{
    int fa,fb;
    fa=find(a);fb=find(b);
    if(fa==fb) return true;
    else {f[fb]=fa;return false;}
}
void kruskal()
{
    sort(edge,edge+k);//按照边排序使树最小
    int cnt=1;
    for(int i=0;i<k;i++)
    {
        if(ok(edge[i].x,edge[i].y)==false) {ans+=edge[i].dis;cnt++;if(cnt==n) return ;}//如果两个边不连通就把这条边加进去
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        k=0;ans=0;
        memset(f,0,sizeof(f));
        for(int i=0;i<n;i++)
        {
            f[i]=i;
            for(int j=0;j<n;j++)
            {
                scanf("%d",&a);
                if(i!=j) {edge[k].x=i;edge[k].y=j;edge[k++].dis=a;}
            }
        }
        kruskal();
        printf("%d\n",ans);
    }
}
View Code

poj 1251 同

poj 2485 最小生成树最大边

poj 2377 最大生成树权值和

posted @ 2017-07-15 19:21  jack_yyc  阅读(115)  评论(0编辑  收藏  举报