Prim算法之二

本文介绍了一种使用Prim算法求解最小生成树(MST)的方法,并提供了完整的C++代码实现。通过该算法,可以有效地从加权图中找出所有顶点组成的总权重最小的树形结构。
//sicily 1090. Highways

#include
<iostream> //最小生成树 Prim算法
using namespace std;
struct MST //最小生成树的边
{
int st,ed,w;
}mst[
1000];
int n,len,edge[1000][1000];
void Prim()
{
int i,j,k;
for(i=0;i<n-1;i++) //默认选择第1个节点加入生成树
{
mst[i].st
=0;mst[i].ed=i+1;
mst[i].w
=edge[0][i+1];
}
for(i=0;i<n-1;++i) //求n-1条边
{
int min=100000;
for(j=i;j<n-1;++j)
{
if(mst[j].w<min) //求最小权值边
{
min
=mst[j].w;k=j;
}
}
swap(mst[k],mst[i]);
//最小边移至前端
int p=mst[i].ed;
len
=max(len,mst[i].w);
for(j=i+1;j<n-1;++j) //更新后面的边
{
int com=edge[p][mst[j].ed];
if(com<mst[j].w)
{
mst[j].w
=com;mst[j].st=p;
}
}
}
}
int main()
{
int cases;
cin
>>cases;
for(int id=1;id<=cases;++id)
{
cin
>>n;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cin
>>edge[i][j];
len
=0; //len保存最小生成树的最长边
Prim();
if(id>1)
cout
<<endl;
cout
<<len<<endl;
}
return 0;
}

  

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/07/17/2108521.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值