微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

POJ1251

//最近在跟着kuangbin大佬疯狂水题 (ORZ)

//Prime算法求最小生成树
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf (0x3f3f3f3f)
using namespace std;
const int maxn = 35;
int Grape[maxn][maxn],d[maxn];
bool vis[maxn];
int n;//节点个数
int pre[maxn];
int Prime()
{
    memset(d,inf,sizeof(d));
    memset(pre,-1,sizeof(pre));
    d[0] = 0;
    while(true)
    {
        int mincost = inf,u = -1;
        for(int v=0;v!=n;++v)
        {
            if(!vis[v]&&d[v]<mincost)//d[v] < inf 则证明有边到达v
            {
                mincost = d[v];
                u = v;
            }
        }
        if(mincost==inf)
            break;
        vis[u] = true;//用 u 节点更新 相邻节点
        for(int v=0;v!=n;++v)
        {
            if(Grape[u][v]!=-1&&!vis[v]&&Grape[u][v]<d[v])
            {
                d[v] = Grape[u][v];
                pre[v] = u;
            }
        }
    }
    int sum = 0;
    for(int v=0;v!=n;++v)
        if(pre[v]!=-1)
            sum += Grape[v][pre[v]];
    return sum;
}
int main()
{
    while(cin>>n&&n)
    {
        memset(Grape,sizeof(Grape));// u ~ v -1表示 不存在边
        memset(vis,false,sizeof(vis));
        char u,v; int num,weight,sum = 0;//权值
        for(int i=0;i!=n-1;++i)
        {
            cin>>u>>num;
            while(num--)
            {
                cin>>v>>weight;
                Grape[u-‘A‘][v-‘A‘] = Grape[v-‘A‘][u-‘A‘] = weight;
                sum += weight;
            }
        }//建图
        cout<<Prime()<<endl;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐