最小生成树之prime算法实现

prime算法的精髓在于:

每次选取一条边。

该边满足:1、一端已选,一端未选;2、该边权值最小。

直到选取n-1条边或选取n个顶点算法结束,求出MST或者判断出不存在MST。

 

代码设计:

1、利用两个集合存放已选顶点和未选顶点

(choosed[]存放已选顶点,unchoosed[]存放未选顶点)

2、每次选取的边都是一端在choosed[]中,另一端在unchoosed[]中的权值最小的边

3、利用STL中vector可以方便的实现图的临界表存储

4、记录组成MST的每条边很方便,只要在选取到一条满足条件的边时记录下起点、终点、权值即可

 

代码:

#include
#include
#include
using namespace std;

const int maxn=101;    //顶点数 
const int INF=0x7fffffff;

struct edge  //边 
{
    int to;    //到达的点 
    int cost;  //边的花费 
    bool flag; //是否入选 
};

int choosed[maxn];      //已选顶点 
int unchoosed[maxn];    //未选顶点 
int nodeNum,edgeNum,MST;  //顶点数、边数、最小生成树 
bool choose[maxn];     //顶点是否已选 
vector myV[maxn];  //图的邻接表 

/* 
  //这是无向图有重复边的建图,取重复边中最小的边存储 
bool exist(int from,int to,int cost)
{
    bool existFlag=false,smallFlag=false;
    
    for(int i=0;icost)
            {
                smallFlag=true;
                myV[from][i].cost=cost;
                break;
            }
        }
    }
    
    if(smallFlag)
    {
        for(int j=0;jto的边已选,那么从to->from的边也已选 
        for(int k=0;k

 

测试实例:

1、图形:

2、输入及结果:

 

问题:

如何利用prime算法求解有向图的MST?

先留在这吧。。。

 

 

 

 


 

你可能感兴趣的:(Graphic,Theory,Algorithms)