最小生成树-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;
}
且一端点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;
}
相关文章推荐
- 求解最小生成树的算法 prim算法(附模板)
- Prim算法模板(求最小生成树)
- 最小生成树kruskal与prim算法模板
- 最小生成树(prim算法与kruskal算法)(模板)
- prim算法模板—最小生成树
- [模板]最小生成树 prim算法
- HDU1162-Eddy's picture-最小生成树(prim算法模板)
- 图论——最小生成树Prim算法模板
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- 最小生成树Prim算法模板
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- prim算法模板 (最小生成树)
- POJ 2421 图的最小生成树 prim算法 模板代码的利用
- 最小生成树(prim算法模板)
- 最小生成树Prim算法模板
- 最小生成树(prim算法)模板
- 最小生成树prim算法模板
- 最小生成树之Prim算法(模板)
- 最小生成树Prim算法模板