最小生成树——Networking

您被指派设计广域内某些点之间的网络连接。您将得到一组区域内的点,以及一组可能连接成对点的电缆的路由。对于两个点之间的每一个可能的路由,给出连接该路由上的点所需的电缆长度。请注意,在两个给定点之间可能存在许多可能的路径。假定给定的可能路线(直接或间接地)连接该地区的每个两点。
您的任务是为该区域设计网络,以便在每两个点之间存在一个连接(直接或间接)(即所有点都相互连接,但不一定由直接电缆连接),并且使用过的电缆的总长度最小。
输入
输入文件由许多数据集组成。每个数据集定义一个所需的网络。集合的第一行包含两个整数:第一行定义给定点的数字P,第二行定义给定点之间的路由数R。下面的R行定义了点之间的给定路径,每个都给出三个整数:前两个数字标识点,第三个数字给出路径的长度。数字用空格分隔。只提供一个数字P=0的数据集表示输入的结尾。数据集用空行分隔。
最大点数为50。给定路径的最大长度为100。可能的路线数目是无限的。节点由1到P(包括)之间的整数标识。两点i和j之间的路线可以作为ij或ji给出。
输出量
对于每个数据集,在一个单独的行上打印一个数字,给出用于整个设计网络的电缆的总长度。
样本输入
1 0

2 3
1 2 37
2 1 17
1 2 68

3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32

5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12

0
样本输出
0
17
16
26

题目思路:最小生成树的板子题,我用的思想是kruskal。本题需要用结构体来排序,否则会失去权与边的联系。而且还要注意在用并查集的查找时,用递归的思路会超限,用循环才能做。

ac代码:
#include<stdio.h>
#include
#include
using namespace std;
int p,r;
int pre[110];
struct node
{
int u;
int v;
int w;
}t[10010];
int cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
return r;
}
int join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
return 1;
}
return 0;
}
int main()
{
while(scanf("%d",&p),p)
{
for(int i=0;i<110;i++)
{
pre[i]=i;
}
scanf("%d",&r);
for(int i=0;i<r;i++)
{
scanf("%d%d%d",&t[i].u,&t[i].v,&t[i].w);
}
sort(t,t+r,cmp);
int sum=0;
for(int i=0;i<r;i++)
{
if(join(t[i].u,t[i].v))
sum+=t[i].w;
}
printf("%d\n",sum);
}
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值