您的位置:首页 > 其它

最小生成树-Prim算法(模板)

2016-08-24 23:19 211 查看
基本算法:首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出与最小生成树中各结点权重最小边,并加入到最小生成树中。选择一条权值最小,

且一端点A已加入生成树,另一端点B在剩余结点集内的边作为最小生成树上的边,同时将B列入生成树的已有点集中。当所有结点都加入到最小生成树中之后,

就找出了连通图中的最小生成树。

Prim算法复杂度是O(n^2),适合稠密图。

/*
Primq求MST
耗费矩阵cost[][],标号从0开始,0~n-1
返回最小生成树的权值,返回-1表示原图不连通
*/

#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=505;
int cost[MAXN][MAXN];
bool vis[MAXN];
int lowc[MAXN];

int Prim(int cost[][MAXN],int n)//点是0~n-1
{
int ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for(int i=1;i<n;i++)
lowc[i]=cost[0][i];
for(int i=1;i<n;i++)
{
int minc=INF;
int p=-1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
}
if(minc==INF)
return -1;//原图不连通
ans+=minc;
vis[p]=true;
for(int j=0;j<n;j++)
{
if(!vis[j]&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j];
}
}
return ans;
}

int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>cost[i][j];
}
}
int res=Prim(cost,n);
cout<<res<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: