洛谷P4716 【模板】最小树形图(朱刘算法)
题意
Sol
朱刘算法?感觉又是一种神仙贪心算法
大概就是每次贪心的用每个点边权最小的入边更新答案,如果不行的话就缩起来找其他的边
不详细说了,丢链接走人..
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, R, fa[MAXN], mn[MAXN], id[MAXN], vis[MAXN];
struct Edge {
int u, v, w, nxt;
}E[MAXN];
int head[MAXN], num = 1;
inline void AddEdge(int x, int y, int z) {
E[num] = (Edge) {x, y, z, head[x]}; head[x] = num++;
}
int ZhuLiu() {
int ans = 0;
while("attack is a pig") {
for(int i = 1; i <= N; i++) id[i] = vis[i] = 0, mn[i] = INF; int cnt = 0;
for(int i = 1; i <= M; i++) if((E[i].u != E[i].v) && (E[i].w < mn[E[i].v])) mn[E[i].v] = E[i].w, fa[E[i].v] = E[i].u;
int x; mn[R] = 0;//tag
for(int i = 1; i <= N; i++) {
if(mn[i] == INF) return -1; ans += mn[i];
for(x = i; (!id[x]) && x != R && (vis[x] != i); x = fa[x]) vis[x] = i;
if(x != R && (!id[x])) {
id[x] = ++cnt; for(int t = fa[x]; t != x; t = fa[t]) id[t] = cnt;
}
}
if(!cnt) return ans;
for(int i = 1; i <= N; i++) if(!id[i]) id[i] = ++cnt;
for(int i = 1; i <= M; i++) {
int tmp = mn[E[i].v];
if((E[i].u = id[E[i].u]) != (E[i].v = id[E[i].v])) E[i].w -= tmp;
}
N = cnt; R = id[R];
}
return ans;
}
int main() {
memset(head, -1, sizeof(head));
N = read(); M = read(); R = read();
for(int i = 1; i <= M; i++) {
int x = read(), y = read(), z = read();
AddEdge(x, y, z);
}
printf("%d", ZhuLiu());
return 0;
}
洛谷P4716 【模板】最小树形图(朱刘算法)的更多相关文章
- 最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- POJ 3164 Command Network ( 最小树形图 朱刘算法)
题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...
- POJ 3164 Command Network 最小树形图 朱刘算法
=============== 分割线之下摘自Sasuke_SCUT的blog============= 最 小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T, ...
- 最小树形图--朱刘算法([JSOI2008]小店购物)
题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...
- POJ - 3164-Command Network 最小树形图——朱刘算法
POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/ ...
- bzoj 4349 最小树形图——朱刘算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ...
- 洛谷.4897.[模板]最小割树(Dinic)
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
- 洛谷.3381.[模板]最小费用最大流(zkw)
题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...
随机推荐
- C++与C的区别一
1. C++风格数组初始化: #include <iostream> #include <array> using namespace std; void main() { / ...
- android Studio 运行不显示avd 无法运行
上图说明: 出现上图页面,有可能是端口被占用了,我出现这种情况是杀死了一个酷狗音乐的进程 干掉以后:
- 实现函数 ToLowerCase()
/** * 实现函数 ToLowerCase(),该函数接收一个字符串参数 str, 并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. * 输入: "Hello" * ...
- ES6之新增let命令使用方法
let命令的用法 let是es6中的声明一个变量的命令,只在它声明的代码块中有效,出了这个代码块就会报错.也非常适合for循环,在循环中i的值只在循环语句中生效,在外边取不到的. var命令声明的是一 ...
- linux 将进程或者线程绑定到指定的cpu上
基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...
- windows 下加载执行hta文件的方法
首先编写这么一个hta的文件: <html> <head> <script> s = new ActiveXObject("WScript.Shell&q ...
- TryParse用法
int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...
- Python爬虫学习:Python内置的爬虫模块urllib库
urllib库 urllib库是Python中一个最基本的网络请求的库.它可以模拟浏览器的行为发送请求(都是这样),从而获取返回的数据 urllib.request 在Python3的urllib库当 ...
- 【Kafka源码】Kafka启动过程
一般来说,我们是通过命令来启动kafka,但是命令的本质还是调用代码中的main方法,所以,我们重点看下启动类Kafka.源码下下来之后,我们也可以通过直接运行Kafka.scala中的main方法( ...
- JavaScript数据结构-16.二叉树计数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...