求最小生成树的prim算法

来源:互联网 发布:有windows.old怎么还原 编辑:程序博客网 时间:2024/05/23 18:34
#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define MAXN 100#define INFINITY 10000000int 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;}

1 0
原创粉丝点击