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 }

 

posted @ 2013-04-29 22:35  zerojetlag  阅读(180)  评论(0编辑  收藏  举报