POJ1287 Networking

本文介绍了一个使用普里姆算法解决最小生成树问题的C++实现。该算法适用于带权重的无向图,并通过不断选择最短边来构建最小生成树。代码详细展示了如何初始化图、执行普里姆算法以及输出最终结果。

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1287

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < iostream >
#include
< limits >
using namespace std;

const int MAX_VETEX_NUM = 100 ;
int nPoints,nRoutes; // 点的个数,边的个数
int route[MAX_VETEX_NUM][MAX_VETEX_NUM]; //
int closedge[MAX_VETEX_NUM];

int prim()
{
// 普里姆算法求最小生成树
int i,j,sum = 0 ;
int v[MAX_VETEX_NUM]; // 选择的顶点集
int k = 1 ; // 初始点为号顶点
for (i = 1 ;i <= nPoints; ++ i)
{
if (i != k)
{
closedge[i]
= route[ 1 ][i];
v[i]
= 0 ;
}
}
v[k]
= 1 ; // 1号点并入顶点集
for (i = 1 ;i <= nPoints; ++ i)
{
int min = numeric_limits < int > ::max();
// 选当前顶点集中顶点到其他顶点的最短边
for (j = 1 ;j <= nPoints; ++ j)
{
if ( ! v[j] && closedge[j] && (closedge[j] < min))
{
// 还没并入过顶点集,有到顶点集中顶点的边
min = closedge[j];
k
= j;
}
}
if (min != numeric_limits < int > ::max())
sum
+= min;
v[k]
= 1 ; // 第k顶点并入顶点集
// 从k顶点出发有更短边,
for (j = 1 ;j <= nPoints;j ++ )
{
if ( ! v[j] && route[k][j] && ((route[k][j] < closedge[j]) || closedge[j] == 0 ))
{
closedge[j]
= route[k][j];
}
}
}
return sum;
}
int main()
{
int i,p1,p2,nCost;
while (cin >> nPoints && nPoints != 0 )
{
cin
>> nRoutes;
if (nRoutes == 0 )
{
cout
<< 0 << endl;
}
else
{
memset(route,
0 , sizeof (route));
for (i = 1 ;i <= nRoutes; ++ i)
{
cin
>> p1 >> p2 >> nCost;
if (route[p1][p2] != 0 )
{
if (nCost < route[p1][p2])
{
route[p1][p2]
= route[p2][p1] = nCost;
}
}
else
{
route[p1][p2]
= route[p2][p1] = nCost;
}
}
cout
<< prim() << endl;
}
}
return 0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值