hdu1233最小生成树 prim算法模板

来源:互联网 发布:郑州知豆电动汽车租赁 编辑:程序博客网 时间:2024/06/05 06:29

思路:

1.从未选节点集合中选择到已选节点距离最近的点;

2.用该点更新未选节点到已选节点集合的距离;

3.不断循环2。

#include<stdio.h>#include<string.h>#include<string>#include<algorithm>#include<iostream>#include<set>#include<map>#include<queue>#include<stack>#include<vector>#include<math.h>#include<stdlib.h>using namespace std;#define M 110#define MAX 2e20int dis[M][M],n;void prim(){int i,j,k,ans=0,tmp,lowcost[M*M];lowcost[0]=0;//初始化将0节点纳入 for(i=1;i<n;i++)//初始化未选节点到已选节点(目前只有0)的距离 {lowcost[i]=dis[0][i];}for(i=1;i<n;i++){int mi=MAX;for(j=0;j<n;j++)//从未选节点中选择距离已选节点最近的点 {if(mi>lowcost[j]&&lowcost[j]!=0){mi=lowcost[j];tmp=j;}}ans+=mi;lowcost[tmp]=0;for(j=0;j<n;j++)//用该点更新为选节点到已选节点集合的距离 {if(lowcost[j]>dis[tmp][j]){lowcost[j]=dis[tmp][j];}}}printf("%d\n",ans);}int main(){int i,j,k,e,a,b;while(scanf("%d",&n),n){e=n*(n-1)/2;for(i=0;i<e;i++){scanf("%d%d%d",&a,&b,&k);a--;b--;dis[a][b]=dis[b][a]=k;}prim();}return 0;}


原创粉丝点击