http://acm.hdu.edu.cn/showproblem.php?pid=1879
prim:
View Code
1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 #define MAX 99999 6 #define LEN 101 7 int dist[LEN]; 8 int map[LEN][LEN]; 9 bool isvisited[LEN]; 10 11 //初始化 12 void init(){ 13 int i,j; 14 for(i=0;i<LEN;i++){ 15 for(j=0;j<LEN;j++){ 16 if(i==j) map[i][j]=0; //对a[][]进行初始化,一般都要; 17 map[i][j]=MAX; 18 } 19 } 20 } 21 22 23 //prim算法 24 int prim(int n){ 25 int i,j,min,pos; 26 int sum=0; 27 memset(isvisited,false,sizeof(isvisited)); 28 29 //初始化 30 for(i=1;i<=n;i++){ 31 dist[i]=map[1][i]; 32 } 33 34 //从1开始 35 isvisited[1]=true; 36 dist[1]=MAX; 37 38 //找到权值最小点并记录下位置 39 for(i=1;i<n;i++){ 40 min=MAX; 41 //pos=-1; 42 for(j=1;j<=n;j++){ 43 if(!isvisited[j] && dist[j]<min){ 44 min=dist[j]; 45 pos=j; 46 } 47 } 48 sum+=dist[pos];//加上权值 49 isvisited[pos]=true; 50 51 //更新权值 52 for(j=1;j<=n;j++){ 53 if(!isvisited[j] && dist[j]>map[pos][j]){ 54 dist[j]=map[pos][j]; 55 } 56 } 57 } 58 return sum; 59 } 60 61 int main(){ 62 63 int n; 64 65 while(cin>>n){ 66 init(); 67 if(n==0) break; 68 69 int i,j,a,b,d,state; 70 71 for(i=0;i<n*(n-1)/2;i++){ 72 73 cin>>a>>b>>d>>state; 74 75 if(state==1){ 76 map[a][b]=map[b][a]=0; 77 } 78 else{ 79 map[a][b]=map[b][a]=d; 80 } 81 } 82 cout<<prim(n)<<endl; 83 84 } 85 return 0; 86 }
Kruskal:
View Code
1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<string.h> 5 struct point{ 6 int x,y; 7 int index; 8 }num[5008]; 9 int flag[102]; 10 int cmp(const void *a,const void *b) 11 { 12 struct point *c,*d; 13 c=(struct point *)a; 14 d=(struct point *)b; 15 return c->index-d->index; 16 } 17 int father(int x) 18 { 19 if(x==flag[x]) 20 return x; 21 flag[x]=father(flag[x]); 22 return flag[x]; 23 } 24 int main() 25 { 26 int n,i,sum,ra,rb,c,d; 27 while(scanf("%d",&n),n) 28 { 29 for(i=0;i<=n;i++) 30 flag[i]=i; 31 for(i=0;i<n*(n-1)/2;i++) 32 { 33 scanf("%d%d%d%d",&num[i].x,&num[i].y,&c,&d); 34 if(d==1)num[i].index=0; 35 else num[i].index=c; 36 } 37 qsort(num,n*(n-1)/2,sizeof(num[0]),cmp); 38 sum=0; 39 for(i=0;i<n*(n-1)/2;i++) 40 { 41 ra=father(num[i].x); 42 rb=father(num[i].y); 43 if(ra==rb)continue; 44 else { 45 sum+=num[i].index; 46 if(ra<rb) 47 flag[rb]=ra; 48 else flag[ra]=rb; 49 } 50 } 51 printf("%d\n",sum); 52 } 53 return 0; 54 }