3.F

题目连接 http://acm.hust.edu.cn/vjudge/contest/123674#proble

这是一道最小生成树的模板题,但在输入字符的时候要特别小心,可以用getchar() +scanf() 虽然这样用了,但是不知道哪里总是有问题

,可能考虑的不周全,干脆用cin,就对了。一个错误折腾的我要死,for循环里的i忘记附初值了,一直没有结果,调试的时候也是调试的要死

一切 表明经验不足,知识也没学到位。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 30
#define M 80
int u[M],v[M],r[M],qu[M];
int  p[N];
void inital()
{
    memset(u,0,sizeof(u));
    memset(v,0,sizeof(v));
    memset(r,0,sizeof(r));
    memset(qu,0,sizeof(qu));
}
int com(const int i,const int j)
{
    return qu[i]<qu[j];
}
int find(int x)
{
    return p[x]==x?x:p[x]=find(p[x]);
}
int Kruskal(int n,int m)
{

   int ans=0;
    for(int i=0;i<n;i++) p[i]=i;
    for(int i=0;i<m;i++) r[i]=i;
    sort(r,r+m,com);
    for(int i=0;i<m;i++)
    {
        int e=r[i];
        int x=find(u[e]); int y=find(v[e]);
        if(x!=y)
        {
            ans+=qu[e];
            p[x]=y;

        }
    }
    return ans;
}
int main()
{
    int n;

    while(scanf("%d",&n)&&n!=0)
    {
        inital();
        char a,b;
        int c,d;
        int bi=0;
        for(int i=0;i<n-1;i++)
        {
            cin>>a>>c;
        //    printf("%c %d %d
",a,c,bi);

            while(c!=0)
            {
                cin>>b>>d;
                u[bi]=(a-'A');
                v[bi]=(b-'A');
                qu[bi]=d;
                //cout<<b<<endl;

              // printf("%d %d %d %d %d 
",u[bi],v[bi],qu[bi],c,bi);
                c--;   bi++;
            }
        }
        printf("%d
",Kruskal(n,bi));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Twsc/p/5716211.html