poj 1258 Agri-Net(最小生成树)

#include<bits/stdc++.h>
using namespace std;
const int inf=1<<24;

int main()
{
    int n,i,j,k,e[50][50],u,v,w,low[50],ans;
    char s;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        memset(e,0,sizeof(e));
        getchar();
        for(i=0;i<n-1;i++)
        {
            scanf("%c %d",&s,&k);
            u=s-'A';
            for(j=0;j<k;j++)
            {
                getchar();
                scanf("%c %d",&s,&w);
                v=s-'A';
                e[u][v]=e[v][u]=w;
            }
            getchar();
        }

        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
        {
            if(!e[i][j]) e[i][j]=inf;
        }

        for(i=0;i<n;i++)
        {
            low[i]=e[0][i];
        }
        low[0]=-1;
        ans=0;
        for(i=1;i<n;i++)
        {
            int t=inf;
            for(k=0;k<n;k++)
            {
                if(low[k]!=-1&&low[k]<t)
                {
                    t=low[k];
                    j=k;
                }
            }
            ans+=t;
            low[j]=-1;
            for(k=0;k<n;k++)
            {
                low[k]=min(e[j][k],low[k]);
            }
        }
        printf("%d
",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

原文地址:https://www.cnblogs.com/xryz/p/4847898.html