kruskal模板题,就是有几个坑点
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
struct node{
int u,v;
int w;
}e[100];
int n,m,father[100];
int cmp(node a,node b){
return a.w<b.w;
}
int findroot(int p){
if(father[p]!=p)
father[p]=findroot(father[p]);
return father[p];
}
void unionset(int p,int q){
father[q]=p;
}
int kruskal(){
int res=0;
int j=0,k=1;
for(int i=0;i<=m;i++)father[i]=i;//由于下面城镇是从0开始标号,所以这里初始化要从0开始,wa了很久才找到这个bug
while(k<n&&j<m){
int m1=e[j].u,m2=e[j].v;
int sn1=findroot(m1),sn2=findroot(m2);
if(sn1!=sn2){
res+=e[j].w;k++;
unionset(sn1,sn2);
}
j++;
}
if(k!=n)res=-1;
return res;
}
int main(){
while(scanf("%d",&n)!=EOF){
if(!n)break;
m=0;
int i,j;
for(i=0;i<n-1;i++){
char c;
int num;
getchar(); //一定要加这句话,不然无法输出答案
scanf("%c %d",&c,&num);
for(j=0;j<num;j++){
char ch;
int w;
getchar();//这里也是
scanf("%c %d",&ch,&w);
e[m].u=c-'A';
e[m].v=ch-'A';
e[m].w=w;
m++;
}
}
sort(e,e+m,cmp);
int ans=kruskal();
printf("%d\n",ans);
}
return 0;
}