今天学的最小生成树,先放上这个裸的题。
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1233
Prim算法
View Code
1 #include<stdio.h> 2 #include<string.h> 3 int map[110][110],lowcost[110],visit[110]; 4 #define N 1000000 5 int prim(int maxminum) 6 { 7 int i,sum,j,k,min; 8 for(i=1;i<=maxminum;i++) 9 { 10 lowcost[i]=map[1][i]; 11 visit[i]=0; 12 } 13 sum=0; 14 visit[1]=1; 15 for(i=1;i<=maxminum;i++) 16 { 17 min=N; 18 for(j=1;j<=maxminum;j++) 19 { 20 if(visit[j]==0&&lowcost[j]<min) 21 { 22 min=lowcost[j]; 23 k=j; 24 } 25 } 26 visit[k]=1; 27 if(min==N) 28 break; 29 sum+=min; 30 for(j=1;j<=maxminum;j++) 31 { 32 if(visit[j]==0&&map[k][j]<lowcost[j]) 33 { 34 lowcost[j]=map[k][j]; 35 } 36 } 37 } 38 return sum; 39 } 40 int main() 41 { 42 int maxmax,maxminum,i,a,b,value,sum; 43 while(~scanf("%d",&maxminum)) 44 { 45 if(maxminum==0) 46 break; 47 memset(map,N,sizeof(map)); 48 maxmax=(maxminum*(maxminum-1))/2; 49 for(i=1;i<=maxmax;i++) 50 { 51 scanf("%d%d%d",&a,&b,&value); 52 if(value<map[a][b]) 53 { 54 map[a][b]=map[b][a]=value; 55 } 56 } 57 sum=prim(maxminum); 58 printf("%d\n",sum); 59 } 60 return 0; 61 }
Kruskal算法
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int map[110],num,sum; 5 struct node 6 { 7 int a; 8 int b; 9 int value; 10 }tax[20000]; 11 int findx(int x) 12 { 13 while(x!=map[x]) 14 { 15 x=map[x]; 16 } 17 return x; 18 } 19 void merge(int x,int y,int z) 20 { 21 int tx=findx(x); 22 int ty=findx(y); 23 if(tx!=ty) 24 { 25 map[tx]=ty; 26 sum+=z; 27 num++; 28 } 29 } 30 int cmp(const void *a,const void *b) 31 { 32 return(*(node*)a).value>(*(node*)b).value?1:-1; 33 } 34 int main() 35 { 36 int maxminum,maxmax,i; 37 while(~scanf("%d",&maxminum)) 38 { 39 if(maxminum==0) 40 break; 41 maxmax=(maxminum*(maxminum-1))/2; 42 for(i=0;i<=maxminum;i++) 43 map[i]=i; 44 for(i=0;i<maxmax;i++) 45 scanf("%d%d%d",&tax[i].a,&tax[i].b,&tax[i].value); 46 sum=0; 47 num=0; 48 qsort(tax,maxmax,sizeof(tax[0]),cmp); 49 for(i=0;i<maxmax&&num<maxminum-1;i++) 50 merge(tax[i].a,tax[i].b,tax[i].value); 51 printf("%d\n",sum); 52 } 53 return 0; 54 }