思路:首先把第一个结点加入树中,每次往树中加入一个结点,加入的结点必须是与当前树中的结点距离最小那个点,这样每次把结点加入树中选取的都是最小权值,循环n-1次后把所有结点都加入树中。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1e9; //创建map二维数组储存图表,low数组记录每2个点间最小权值,vis数组标记某点是否已访问 int map[110][110],low[110],vis[110],n; int prim() { int i,j,Min,pos=1,result=0; memset(vis,0,sizeof(vis)); //从某点开始,分别标记和记录该点 vis[1]=1; //第一次给low数组赋值 for(i=1;i<=n;i++) { if(i!=pos) low[i]=map[pos][i]; } for(i=1;i<n;i++) { //找出最小权值并记录位置 Min=MAXN; for(j=1;j<=n;j++) { if(!vis[j]&&Min>low[j]) { Min=low[j]; pos=j; } } //标记该点 vis[pos]=1; //最小权值累加 result+=Min; for(j=1;j<=n;j++) { if(!vis[j]&&low[j]>map[pos][j]) { low[j]=map[pos][j]; } } } return result; } int main() { int i,j,v,ans; //freopen("d:\\test.txt","r",stdin); while(cin>>n) { //所有权值初始化为最大 memset(map,MAXN,sizeof(map)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>v; map[i][j]=map[j][i]=v; } } ans=prim(); cout<<ans<<endl; } //fclose(stdin); return 0; }
POJ1258最小生成树(prim算法),布布扣,bubuko.com
时间: 2024-10-11 10:47:21