题目链接\(Click\) \(Here\)

不知道有什么用的一个东西。本来不打算再大量扩知识点了但还是学一下好了,反正也不难。

原理:树上父亲唯一,每次选最短的父边。

此时会有两类情况:

  • 就这样正常连下去,这样我们就得到了一个尽可能小的树形图。

  • 成环。这种情况下我们需要拆掉环里的一条边换成其他的边。

我们记录一下到达每个点的最短父边权值是多少。对于成环的情况,可以先把环里面所有边的权值选上,把环里面的所有点看成一个。然后等到有其它外来的边连进来的时候,再选一个最小的外来边,去掉环里面原先所暂时使用的边,换成外来的那个,就这样一直求解直到不再有环。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 100 + 5;
const int M = 10000 + 5;
const ll INF = 0x3f3f3f3f; int n, m, r; struct edge {int u, v, w;} e[M]; int fa[N], id[N], top[N], minw[N]; ll get_ans (int n, int m) {
ll ans = 0;
while (true) {
int cnt = 0;
for (int i = 1; i <= n; ++i) {
id[i] = top[i] = 0; minw[i] = INF;
}
for (int i = 0; i < m; ++i) {
if (e[i].u != e[i].v && e[i].w < minw[e[i].v]) {
fa[e[i].v] = e[i].u;
minw[e[i].v] = e[i].w;
}
}
minw[r] = 0;
for (int i = 1; i <= n; ++i) {
if (minw[i] == INF) return -1;
ans += minw[i];
int u = i;
while (u != r && top[u] != i && !id[u]) {
top[u] = i;
u = fa[u];
}
if (u != r && !id[u]) {
id[u] = ++cnt;
for (int v = fa[u]; v != u; v = fa[v]) id[v] = cnt;
}
}
if (cnt == 0) return ans;
for (int i = 1; i <= n; ++i) {
if (!id[i]) id[i] = ++cnt;
}
for (int i = 0; i < m; ++i) {
int prew = minw[e[i].v];
e[i].u = id[e[i].u];
e[i].v = id[e[i].v];
if (e[i].u != e[i].v) {
e[i].w -= prew;
}
}
n = cnt; r = id[r];
}
} int main () {
cin >> n >> m >> r;
for (int i = 0; i < m; ++i) {
static int u, v, w;
cin >> u >> v >> w;
e[i] = (edge) {u, v, w};
}
cout << get_ans (n, m) << endl;
}

以及非常感谢 @旋转卡壳 的代码。仅仅是读注释就可以快速理解整个算法的流程。(虽然代码不加空格\(www\))

Luogu P4716 【模板】最小树形图的更多相关文章

  1. 【刷题】洛谷 P4716 【模板】最小树形图

    题目背景 这是一道模板题. 题目描述 给定包含 \(n\) 个结点, \(m\) 条有向边的一个图.试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\ ...

  2. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  3. HDU 2121 Ice_cream’s world II 最小树形图 模板

    开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  4. POJ 3164 Command Network(最小树形图模板题+详解)

    http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...

  5. UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)

    题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...

  6. poj 3164(最小树形图模板)

    题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...

  7. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  8. poj 3164 最小树形图模板!!!

    /* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...

  9. poj3164最小树形图模板题

    题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...

  10. hdu 4009 最小树形图模板题朱刘算法

    #include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...

随机推荐

  1. vue+原生JavaScript实现slideDown与slideUp[简单思路]

    整个代码如下: <template> <div style="width:400px;margin:100px auto;"> <div class= ...

  2. 微信web页面返回刷新

    问题:在微信web页面开发的过程中,会遇到返回上一个页面数据没有刷新的情况. 解决方案:在该页面监控用户的浏览,每次加载都刷新页面. window.onpageshow = function(even ...

  3. 在VS 2017 下创建 Xamarin NuGet Package

    最近在做一个Xamarin for android的项目,有个需求是一次可以从相册中选择多张图片,但是 android API<19 的版本还不支持一次选择多张图片,在网上找了一下,发现原生的组 ...

  4. 【升鲜宝】生鲜配送管理系统_升鲜宝供应链系统V2.0 客户管理模块功能与设计,欢迎大家批评指点。

    [升鲜宝] 客户管理模块功能设计与介绍 客户模块分为以下子功能  客户列表 价格组 价格组商品价格 客户退货 客户星级 客户类型 客户存储位 客户来源 物流公司 打印模板 子模块介绍        客 ...

  5. C# 通用单例窗体类

    /// <summary> /// 通用的单例制作器 /// </summary> /// <typeparam name="T"></t ...

  6. 基于Android的模拟点击探索

    前言 压力测试中,一般会用到自动化测试.准备写一个APP,可以记录屏幕上的点击事件,然后通过shell命令来模拟自动执行.shell指令,比较容易实现.那么,关键的一步是获取点击的坐标.对于Andro ...

  7. linux子系统折腾记 (二)

    今天一早起床,打开debian,居然出现 错误: 0x80070040 .不知道是怎么回事,网上有篇文章详细介绍了windows linux子系统,打算参考来做做:https://www.jiansh ...

  8. HTTP各个status code是什么意思【已解决】

    在介绍状态码之前,要简单讲一下为什么要有状态码这个东西.计算机之间的通信以协议为共同基础,客户端和服务端都按照协议的约定进行通信.HTTP的状态码就在HTTP的协议内,规定了很多的状态.客户端请求服务 ...

  9. matplotlib箱线图与柱状图比较

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 16:37:47 2018 @author: zhen &qu ...

  10. Ubuntu 16.04 屏幕亮度无法调节怎么办

    安装好ubuntu 16.04之后,发现屏幕超亮,找不到调节按钮,这应该是系统的一个漏洞, 不过可以安装工具来操作,从而解决亮度调节问题,下面是安装  Brightness Controller 的方 ...