Hdu 1301 prim算法 生成最小生成树

小弟初学最小生成树算法,起初还是自己的几个队友教会了我思想,最小生成树说白了就是在一个图当中寻找出n-1条边使得n个结点都是连通的,但是边权值总和最小。

   Prim算法是通过不断寻找结点,找出当前所生成的树周围的边权值最小的一个边把这条边给纳入进来,然后通过纳入进来所引入的新的结点来更新现在整个树到达其他未进入到生成树中来的距离,使得每次总能纳入最小的边权值而引入新结点。

具体代码如下:

View Code
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h> 
 4 #define MaxSize 10000000
 5 using namespace std;
 6 int map[30][30]; 
 7 int main()
 8 {
 9    int n,m,w,visit[30],low[30];
10    char start,end; 
11    while(scanf("%d",&n)!=EOF&&n)
12    { 
13        memset(map,-1,sizeof(map));
14        for(int i=0;i<n-1;i++)
15        {
16            getchar();
17            scanf("%c",&start);
18            scanf("%d",&m);
19            for(int i=0;i<m;i++)
20            {
21               getchar();
22               scanf("%c %d",&end,&w);
23               map[start-64][end-64]=w;
24               map[end-64][start-64]=w; 
25            } 
26        }   
27        memset(visit,0,sizeof(visit));
28        int pos=1,result=0;
29        visit[1]=1;
30        for(int i=1;i<=n;i++)
31        {
32           low[i]=map[pos][i]; //随便需找其中一个点,将整个点作为起始生成树,并将该起始生成树到每个点的距离赋进去。
33        }
34        for(int i=0;i<n-1;i++)//接下来只要找到剩下的n-1个点
35        {
36             int valueMin=MaxSize;
37             for(int j=1;j<=n;j++)
38             {
39               if(!visit[j]&&low[j]!=-1&&low[j]<valueMin)
40               {
41                  valueMin=low[j];
42                  pos=j;//每次都寻找要纳入进来的边的位置
43               }
44             }
45             result+=valueMin;
46             visit[pos]=1;
47             for(int j=1;j<=n;j++)
48             {
49               if(!visit[j]&&(map[pos][j]<low[j]||low[j]==-1)&&map[pos][j]!=-1)
50               {
51                  low[j]=map[pos][j];
52               }  
53             }
54       }
55        printf("%d\n",result);
56    } 
57    return 0;    
58 } 

 

posted @ 2012-09-01 21:51  诺小J  阅读(242)  评论(0编辑  收藏  举报