- A+B Problem
- @ 2017-10-17 22:29:47
#include "iostream"
#include "map"
#include "cstring"
#include "algorithm"
#define MAXN 10010
#define init(a,b) memset(a,b,sizeof(a))
using namespace std;
int cnt=1;
int rep[MAXN];
int n;
struct Edge
{
    int from;
    int to;
    int value;
    bool operator < (const Edge &a)
    {
        return this->value<a.value;
    }
}e[MAXN];
bool comp(const Edge &a,const Edge &b)
{
    return a.value<b.value;
}
void Initialize()
{
    cnt=1;
    init(rep,0);
    init(e,0);
}
int Find(int x)
{
    if(x!=rep[x]) rep[x]=Find(rep[x]);
    return rep[x];
}
void Union(int a,int b)
{
    rep[Find(a)]=Find(b);
}
int Kruskal()
{
    int ans=0;
    sort(e,e+cnt);
    for(int i=1;i<=cnt;i++)
    {
        int a=e[i].from,b=e[i].to;
        if(Find(a)!=Find(b))
        {
            Union(a,b);
            ans+=e[i].value;
        }
    }
    return ans;
}
void Add_Edge(int x,int y,int p)
{
    e[++cnt].to=y;
    e[cnt].from=x;
    e[cnt].value=p;
}
int main()
{
    cin>>n;
    while(n)
    {
        Initialize();
        for(int k=1;k<=n-1;k++)
        {
            char u;
            cin>>u;
            int edge;
            cin>>edge;
            for(int i=1;i<=edge;i++)
            {
                char v;
                int p;
                cin>>v>>p;
                int x=u-'B',y=v-'B';
                Add_Edge(x,y,p);
            }
        }
        cout<<Kruskal()<<endl;
        cin>>n;
    }
    return 0;
}
3 条评论
- 
  咕哒子 LV 4 @ 2017-10-18 13:10:01其因或福避趋知 
- 
  @ 2017-10-18 13:08:22什么鬼 
- 
  @ 2017-10-18 13:04:24什么鬼 
- 1
信息
- ID
- 1000
- 难度
- 9
- 分类
- (无)
- 标签
- (无)
- 递交数
- 75087
- 已通过
- 28721
- 通过率
- 38%
- 被复制
- 261