题目链接\(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. ArcGIS API for JavaScript 入门教程[7] 再讲视图——View的基本属性

    [回顾]上篇花大篇幅讲了ArcGIS Server上的数据服务与部分常用可操作图层的创建关系,还讲了OGC的几个规范. 本篇回到JsAPI 4.x的新特性——视图类中来. 在第3篇讲过,4.x将视图从 ...

  2. MyDAL - in && not in 条件 使用

    索引: 目录索引 一.API 列表 C# 代码中 接口 IList.Contains() 方法生成 SQL 对应的 in(val1,val2,... ...) 如:.Queryer<Agent& ...

  3. matplotlib正弦和余弦图

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

  4. 数据库原理 - 序列7 - Binlog与主从复制

    本文节选自作者书籍<软件架构设计:大型网站技术架构与业务架构融合之道>.作者微信公众号:架构之道与术.公众号底部菜单有书友群可以加入,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...

  5. windows已激活,但提示:windows 7 内部版本7601 此windows副本不是正版

    把三个服务改为自动:

  6. 从0开始的Python学习013编写一个Python脚本

    通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本. 问题 需求: 我想要一个可以给我备份重要文件的程序. 需求分析: 首先文件是有存储路径,文件的路径和 ...

  7. php 7.1 新特性解析

    php 7.1 新特性解析 返回值和传入参数可以指定为 null <?php function testReturn(): ?string { return 'elePHPant'; } var ...

  8. 【spring源码分析】IOC容器初始化(十二)

    前言:在doCreateBean方法中还遗留一个问题没有分析:循环依赖.循环依赖在Spring中是非常重要的一个知识点,因此单独进行分析. 什么是循环依赖 循环依赖就是循环引用,两个或两个以上的bea ...

  9. shell编程企业级实战

    如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...

  10. java-环境变量的配置

    java基础教程 链接:https://pan.baidu.com/s/1dGHrkghUJi2lew8dbWlIvg 提取码:87mi