#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 100
#define INFINITY 10000000
int n,m;
struct edge{
int to;
int weight;
int next;
}edges[MAXN];
int head[MAXN];
int book[MAXN];
int cnt=0;
void Init(){
for(int i=1;i<=m;i++)
edges[i].next=0;
for(int i=1;i<=n;i++)
head[i]=0;
}
void Add(int x,int y,int w){
cnt++;
edges[cnt].to=y;
edges[cnt].weight=w;
edges[cnt].next=head[x];
head[x]=cnt;
}
void Prim(){
int ind,minDis;
int count,sum=0;
//从顶点1开始
memset(book,0,sizeof(book));
book[1]=1;//已经加入生成树的点做个标记
count=1;
while(count<n){
minDis=INFINITY;//查找一个点 已在生成树中的点到该点的距离最小
for(int i=1;i<=n;i++){
if(book[i]){
for(int j=head[i];j;j=edges[j].next){
if(!book[edges[j].to]&&minDis>edges[j].weight){
ind=edges[j].to;
minDis=edges[j].weight;
}
}
}
}
if(minDis==INFINITY){
printf("The minimum spanning tree is not existed!\n");
return;
}
book[ind]=1;
sum+=minDis;
count++;
}
printf("The weights of the minimum spanning tree is %d\n",sum);
}
int main(){
int x,y,w;
cin>>n>>m;
Init();
for(int i=1;i<=m;i++){
cin>>x>>y>>w;
Add(x,y,w);
Add(y,x,w);
}
Prim();
return 0;
}
求最小生成树的prim算法
最新推荐文章于 2017-03-31 15:16:49 发布