最小生成树之prim算法

来源:互联网 发布:sql查询每小时 编辑:程序博客网 时间:2024/06/15 13:15

很简单的一题最小生成树的题目

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。

prim 算法

就是从一个点开始衍生,找与此点相连的最短的边,采用那条边,获得另一个点。之后再以这两个点为基础,找与这两点相连的最短的边……直到所有点都连在一起。这个方法需要每次把边排序,很耗时,用堆排能大量缩短时间。学了c++后,可以使用优先队列,非常方便。

#include<iostream>#include<queue>using namespace std;class list{public:    int value;//记录边值    int x;//记录于之相连的点    bool friend operator < ( const list &a,const list &b){       return (a.value>b.value);}//由于要的是最小边,所把优先队列修改下,把小的放前面};const int MAXN=112;priority_queue<list> Q;list temp;int n,sum;int a[MAXN][MAXN],p[MAXN];//p数组用于记录点是否以及加入void push(int x){    p[x]=1;    for (int i=1;i<=n;i++)    if (p[i]==0)    {        temp.value=a[x][i];        temp.x=i;        Q.push(temp);    }}void prim(){    int num;记录已经加入了几个点了    push(1);//随便加入一个点0.0  
    num=1;
    while (num!=n)    {        do{           temp=Q.top();           Q.pop();        }while(p[temp.x]==1);//找到一个还没进入的点        sum+=temp.value;        push(temp.x);//将此点加入        num++;    }}int main(){    int i,j;    cin>>n;    for (i=1;i<=n;i++)        for (j=1;j<=n;j++)        cin>>a[i][j];    prim();    cout<<sum<<endl;}

如有不足之处,希望大家指出。


0 0