点击打开链接
krusual:
#include"stdio.h" #include"stdlib.h" int set[101]; struct node { int a,b,dis; }aa[101]; int find(int x) { int r,i; r=x; while(set[r]!=r) r=set[r]; while(set[x]!=r) { i=set[r]; set[x]=r; r=i; } return r; } int cmp(const void*a,const void*b) { struct node *c,*d; c=(struct node*)a; d=(struct node*)b; return c->dis-d->dis; } int main() { int n,i,j,k,ans,cnt; int x,y,t,tt,ttt; char c,cc,str[100]; while(scanf("%d",&n)!=EOF&&n) { for(i=0;i<=100;i++) set[i]=i; k=0; for(i=0;i<n-1;i++) { scanf(" %c %d",&c,&t); for(j=0;j<t;j++) { scanf(" %c %d",&cc,&tt); aa[k].a=c-'A'; aa[k].b=cc-'A'; aa[k++].dis=tt; } } qsort(aa,k,sizeof(aa[0]),cmp); ans=0;cnt=0; for(i=0;i<k;i++) { x=find(aa[i].a); y=find(aa[i].b); if(x!=y) { ans+=aa[i].dis; set[x]=y; if(++cnt==n-1)break; } } printf("%d\n",ans); } return 0; }prime
#include"stdio.h" #include"string.h" #define INF 9999999 int map[30][30],mark[30],f[30]; int n; void prime() { int i,j,k,min,ans; memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) f[i]=map[0][i]; f[0]=0;mark[0]=1; ans=0; /*prime算法只与边的个数有关,因为n个点有n-1个边, 所以,循环进行n-1次,否则就会把定义的INF也加入最小生成树*/ for(i=0;i<n-1;i++) { min=INF; for(j=0;j<n;j++) { if(!mark[j]&&f[j]<min) { min=f[j];k=j; } } ans=ans+min; mark[k]=1; for(j=0;j<n;j++) { if(!mark[j]&&f[j]>map[k][j]) f[j]=map[k][j]; } } printf("%d\n",ans); } int main() { int i,j,t,tt; char c,cc; while(scanf("%d",&n)!=-1&&n) { memset(map,76,sizeof(map)); for(i=0;i<n-1;i++) { scanf(" %c %d",&c,&t); for(j=0;j<t;j++) { scanf(" %c %d",&cc,&tt); map[c-'A'][cc-'A']=map[cc-'A'][c-'A']=tt; } } prime(); } return 0; }