hdu 1102
最小生成树
1.prim适用于稠密图
2.kruskal适用于稀疏图
prim
1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=105; 4 int map[MAXN][MAXN]; 5 int v[MAXN]; 6 int main() 7 { 8 int n; 9 while(~scanf("%d",&n)) 10 { 11 for(int i=1;i<=n;i++) 12 { 13 for(int j=1;j<=n;j++) 14 { 15 scanf("%d",&map[i][j]); 16 if(i==j) 17 map[i][j]=0; 18 } 19 } 20 memset(v,0,sizeof(v)); 21 int m; 22 scanf("%d",&m); 23 for(int i=0;i<m;i++) 24 { 25 int x,y; 26 scanf("%d%d",&x,&y); 27 map[x][y]=0; 28 map[y][x]=0; 29 } 30 31 int sum=0; 32 v[1]=1; 33 for(int i=2;i<=n;i++) 34 { 35 int min=0x0f0f0f0f; 36 int p=0; 37 for(int j=1;j<=n;j++) 38 { 39 if(!v[j]&&map[1][j]<min) 40 { 41 min=map[1][j]; 42 p=j; 43 } 44 } 45 v[p]=1; 46 sum+=min; 47 for(int j=1;j<=n;j++) 48 { 49 if(!v[j]&&map[1][j]>map[p][j]) 50 { 51 map[1][j]=map[p][j]; 52 } 53 } 54 } 55 printf("%d\n",sum); 56 } 57 return 0; 58 }
kruskal:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAXN 105 4 int map[MAXN][MAXN]; 5 struct road 6 { 7 int s,e; 8 int w; 9 }roads[(MAXN*MAXN)]; 10 11 int vset[MAXN]; 12 int pro[MAXN]; 13 14 int cmp(const void *a,const void *b) 15 { 16 road x=*(road *)a;road y=*(road *)b; 17 return x.w-y.w; 18 } 19 20 int find(int s) 21 { 22 if(s!=vset[s]) 23 return find(vset[s]); 24 return s; 25 } 26 27 void unite(int x,int y) 28 { 29 if(x == y) 30 return ; 31 if(pro[x] > pro[y]) 32 { 33 vset[y] = x; 34 } 35 else 36 { 37 vset[x] = y; 38 if(pro[x] == pro[y]) 39 pro[y]++; 40 } 41 } 42 43 int kruskal(int n) 44 { 45 int sum=0; 46 int k=0; 47 for(int i=1;i<=n;i++) 48 { 49 for(int j=1;j<=n;j++) 50 { 51 roads[k].s=i; 52 roads[k].e=j; 53 roads[k++].w=map[i][j]; 54 } 55 } 56 57 qsort(roads,k,sizeof(road),cmp); 58 for(int i=1;i<=n;i++) 59 { 60 vset[i]=i; 61 pro[i]=0; 62 } 63 64 int j=0; 65 k=0; 66 while(j<n-1) 67 { 68 int x=find(roads[k].s); 69 int y=find(roads[k].e); 70 if(x!=y) 71 { 72 j++; 73 sum+=roads[k].w; 74 unite(x,y); 75 } 76 k++; 77 } 78 79 return sum; 80 } 81 82 int main() 83 { 84 int n; 85 while(~scanf("%d",&n)) 86 { 87 for(int i=1;i<=n;i++) 88 { 89 for(int j=1;j<=n;j++) 90 { 91 scanf("%d",&map[i][j]); 92 if(i==j) 93 map[i][j]=0; 94 } 95 } 96 int m; 97 scanf("%d",&m); 98 for(int i=1;i<=m;i++) 99 { 100 int x,y; 101 scanf("%d%d",&x,&y); 102 map[x][y]=0; 103 map[y][x]=0; 104 } 105 printf("%d\n",kruskal(n)); 106 } 107 return 0; 108 }