51nod 1212 无向图最小生成树(输出生成树)

#include <iostream>
#include <cstring>
using namespace std;
#define max 1001
int i,j,k;
int graph[max][max];
int prim(int graph[][max],int n)//加点法
{
int vis[max]={0},dis[max]={0};
memset(vis,0,sizeof(vis));
int sum=0,min=max,number;
//vis数组记录这个点是否已经加入最小生成树
//dis数组表示当前最小生成树(集体)的可以到达的非最小生成树的点的最小距离
bool meme=true;
//控制输出路径
for(i=2;i<=n;i++)
dis[i]=graph[1][i];
//从1开始,dis数组初始化
vis[1]=1;
//1点刚开始已访问
// cout<<1<<' ';
for(i=2;i<=n;i++)
//从第二次访问开始(并不是第二个点),控制一共访问n次,所有的点已访问
{
min=max;number=-1;//每次访问新点时重新赋值min
for(j=1;j<=n;j++)
{
if(vis[j]==0&&dis[j]<min)
{
min=dis[j];
number=j;
//number记录当前最小权值的下标,方便vis标记
}
}
//这个for执行完之后就可以找到dis数组里面的最小权值是min,对应的点是j
sum+=min;
/* if(i==n)
cout<<number<<endl;
else
cout<<number<<endl<<number<<' '; //这个if输出边
*/
vis[number]=1;//将j点标记为已加入
for(j=1;j<=n;j++)
if(vis[j]==0&&graph[number][j]<dis[j])
dis[j]=graph[number][j];


}
return sum;


}
int main()
{
int n,m,x,y,z;
cin>>n>>m;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
graph[i][j]=max;
for(i=0;i<m;i++)
{
cin>>x>>y>>z;
graph[x][y]=z;
graph[y][x]=z;
}
int small=prim(graph,n);
cout<<small<<endl;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值