您的位置:首页 > 其它

最小生成树Prim算法模板

2017-07-26 19:34 239 查看

题目地址:

http://poj.org/problem?id=1251

该题是个模板题,所以直接拿来做模板了。

该代码是AC代码。

代码:

#include <iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#define MAX 27
//图的规模
#define INF 99999999
//定义无穷大
using namespace std;
int N;
//节点的数目N
//此外,在这里可能会有路径的数目M
int map[MAX][MAX];
//邻接表
int micost[MAX];
//到上一个点的最小路径
int vis[MAX];
//记录该点有没有加入最小生成树中
void Prim()
{
int i,j,v,Min;
int ans;
//最小生成树的总权值
//1是第一个加入该最小生成树的节点
for(i=1;i<=N;i++)
{
micost[i]=map[1][i];
vis[i]=0;
}//初始化节点
//定义每个节点的micost为1到其他点的距离
micost[1]=0;
vis[1]=1;
//起点的上一个节点没有节点,所以为0
//定义起点已经加入了最小生成树
ans=0;
//初始化最小生成树的权值为零
//注意在循环里起点不包含进去
//为了防止错误
//因为不包含起点所以循环要从i=2开始
for(i=2;i<=N;i++)
{
Min=INF;
for(j=2;j<=N;j++)
{
if(!vis[j]&&Min>micost[j])
v=j,Min=micost[j];
}//找micost最小的节点并加入最小生成树
vis[v]=1;
if(Min!=INF)
ans=ans+Min;
for(j=2;j<=N;j++)
{
if(!vis[j]&&micost[j]>map[v][j])
micost[j]=map[v][j];
}//更新节点
}
cout<<ans<<endl;
}
int main()
{
int i,j,num,x,y,z;
char a,b;
while(cin>>N,N)//输入图的节点数,路径数,(一般情况下)
{
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(i==j)map[i][j]=0;
else
map[i][j]=INF;
}//初始化邻接表
for(i=1;i<N;i++)
{
cin>>a>>num;
for(j=1;j<=num;j++){
cin>>b>>z;
x=a-64;
y=b-64;
map[x][y]=map[y][x]=z;
}
}//输入图
Prim();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: