【贪心】畅通工程系列3-HDU1879 继续畅通工程-kruskal算法

题目

http://acm.hdu.edu.cn/showproblem.php?pid=1879

问题分析

这个题依旧是把村庄作为顶点,把道路作为边,不过与之前不同的是有的边已经存在,那么计算的时候就不用计算这些已有道路的成本,而是要先考虑这些边对于整个图连通的影响,在此基础上求生成树所需要的最小总边权值。

算法

算法核心

这个题与HDU1863非常相似,区别在于有的道路已经存在,那么在输入循环中将这些已有边的边权值置为0即可。

算法流程

首先在输入的时候将已存在边的边权置为0,即已修道路的成本为0,然后将每个顶点的根结点初始化为本身,之后按照边权值从低到高将边排序,然后遍历每一条边,如果两个顶点不在同一个连通分支上,就根据两个顶点根结点的大小关系将一个分支连到另一个分支上,成本增加,当前道路数增加,直至当前道路数为顶点数-1(树的性质),退出循环,最后输出成本即可。

数据结构

并查集
如感兴趣可移步畅通工程系列1

一点思考

之前写的实现方法是,在输入循环中,判断这条边是否存在,如果存在成本置0,然后将两个顶点合并,道路数增加,后来发现没有必要,直接在kruskal中进行就可以,因为是按成本从低到高排序的,所以这些已有边的成本为0,一定是要先进行循环的。

代码实现

温馨提示:用cin,cout会TLE,我就出了这种问题,刚开始还不道为啥。

#include
#include
#include
using namespace std;
const int maxn=105;

struct road
{
    int b;
    int e;
    int v;
} a[maxn*maxn/2];

int n,m;//顶点数,边数
int root[maxn];
int ans,cnt;//成本,道路数

void init()
{
    for(int i=0; i

你可能感兴趣的:(算法,贪心,HDU,畅通工程,kruskal,图论)