继续畅通工程

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 }

 

 

posted @ 2013-03-07 18:45  yelan@yelan  阅读(179)  评论(0编辑  收藏  举报