prim

prim算法是计算最小生成树的一种算法。

运算方法是任取一个点,以这个点为集合开始,然后对所有点与这个点的距离进行更新,找出离这个集合最近的点,然后把这个点放进这个集合(所以每一次运算的时候都要判断一下这个点是否在这个集合里,所有要用到一个vister数组),然后再以这个集合继续寻找离这个集合最近的点,直到没有点存在。

输入:N个点和邻接矩阵

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 //==============================================================================
 6 void init();
 7 void prim();
 8 //==============================================================================
 9 int map[105][105],vister[105],dis[105],N,ans=0;
10 //==============================================================================
11 void init()
12 {
13    cin>>N;
14    for(int i=1;i<=N;i++){
15       for(int j=1;j<=N;j++){
16          cin>>map[i][j];
17       }
18    }
19    memset(dis,0x3f3f3f3f,sizeof(dis));  //对距离初始化为无穷
20 }
21 //==============================================================================
22 void prim()
23 {
24    //对这个点的距离初始化为0.
25    dis[1]=0;
26    for(int i=1;i<=N;i++){
27       int MIN=0x3f3f3f3f;  //寻找最小值
28       int x;               //最小值得坐标
29       for( int j=1;j<=N;j++ ){
30          if( vister[j]==0 && MIN>dis[j] ){
31             MIN=dis[j];
32             x=j;
33          }
34       }
35       //======================
36       ans+=dis[x];      //将找到的最小边加入答案里
37       vister[x]=1;      //标记这个点被访问
38       //======================
39       for(int j=1;j<=N;j++){     //循环更新距离数组
40          if( dis[j]>map[x][j] && map[x][j]>0 && vister[j]==0 ){
41             dis[j]=map[x][j];
42          }
43       }
44    }
45 }
46 //==============================================================================
47 int main()
48 {
49    init();
50    prim();
51    cout<<ans;
52    //system("pause");
53    return 0;
54 }

 

posted on 2016-09-30 15:31  fuyun_boy  阅读(2154)  评论(0)    收藏  举报

导航