poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法

这是一篇关于使用Kruskal算法解决POJ 1751题目的博客。题目要求在n个城市中找到最小代价的道路连接方案,使所有城市彼此联通。文章通过详细讲解算法思路,特别是如何判断节点是否在同一联通分量,给出解决问题的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=1751

大意是一个有n个城市的国家,已知有些城市有道路联通,问增加哪些道路使得所有的城市都可以彼此联通且代价最小,已经代价是两个城市坐标的笛卡尔距离;

就是一个纯粹的找最小生成树的题;

 

首先讲所有边按权值从小到大排序,然后依次取最小边,如果联通的两个节点在两个联通分量上,则加入这条边,否则删除这条边;

kruskal算法的要点就是判断两个节点是不是在一个联通分量上,于是够着个标记数组flag[];开始时候令flag[i]=i;这样就所有的节点都是一个联通分量,然后在取已有的m条边时,

设边链接的节点为u,v,则令f[u]=f[v];就行了,这样两个节点就在一个联通分量上了,不过操作的时候不是f[u]=f[v]这么简单,因为必须使u在的联通分量和v在的联通分量联通起来,所以每个联通分量里的节点的flag值可以指向同一个节点,具体的操作见下面代码:

 

此题输出边的时候没有要求顺序;

 

参考代码如下:

 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int MAX_SIZE=800;
struct Node
{
    int u,v;
    double w;
    bool operator < (const Node a)const
    {
        return w<a.w;
    };
}edge[MAX_SIZE*MAX_SIZE/2];
struct point
{
    int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值