题目连接 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; }