HDU1233 还是畅通工程【最小生成树】

题意:

求出连接各个村庄最小的公路总长度,把最小公路总长度求出来。

思路:

最小生成树原理,带入数据求得。

代码:

prim:

#include<iostream>
#include<cstring>

using namespace std;
#define inf 0x3f3f3f3f

int main()
{
    int n, i,j,b,c,d,min,a[105][105],visit[105],low[105];
    while(cin>>n,n)
    {
        memset(visit,0,sizeof(visit));
        int temp=n*(n-1)/2;
        while(temp--)
        {
            cin>>b>>c>>d;
            a[b][c]=a[c][b]=d;
        }
        visit[1]=1;int pos=1;  //第一次给low赋值
        for(i=1;i<=n;++i)
        {
            if(i!=pos) low[i]=a[pos][i];
        }
        int result=0; //运行m-1次,因为至少需要m-1次才能把所有的城市连通
        for(i=1;i<n;++i)
        {
            min=inf;
            for(j=1;j<=n;++j)
            {
                if(!visit[j]&&min>low[j])
                {
                    min=low[j];
                    pos=j;
                }
            }
            result+=min;
            visit[pos]=1;
            for(j=1;j<=n;++j)
            {
                if(!visit[j]&&low[j]>a[pos][j])
                {
                    low[j]=a[pos][j];
                }
            }
        }
        cout<<result<<endl;
    }
    return 0;
}

krusual:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

struct node
{
    int u,v,w;
};

node arr[10000];
int per[110],n;

bool cmp(node a,node b)
{
    return a.w<b.w;
}

void init()
{
    for(int i=1;i<=n;++i)
    {
        per[i]=i;
    }
}

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

bool join(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    {
        per[fx]=fy;
        return 1;
    }
    return 0;
}

int main()
{
    int m;
    while(cin>>n,n)
    {
        init();
        m=n*(n-1)/2;
        for(int i=0;i<m;++i)
        {
            cin>>arr[i].u>>arr[i].v>>arr[i].w;
        }
        sort(arr,arr+m,cmp);
        int sum=0;
        for(int i=0;i<m;++i)
        {
            if(join(arr[i].u,arr[i].v))
            {
                sum+=arr[i].w;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/darklights/p/7647874.html