【刷题】洛谷 P4716 【模板】最小树形图
题目背景
这是一道模板题。
题目描述
给定包含 \(n\) 个结点, \(m\) 条有向边的一个图。试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\) 为根的最小树形图,输出 \(-1\) 。
输入输出格式
输入格式:
第一行包含三个整数 \(n,m,r\) ,意义同题目所述。
接下来 \(m\) 行,每行包含三个整数 \(u,v,w\) ,表示图中存在一条从 \(u\) 指向 \(v\) 的权值为 \(w\) 的有向边。
输出格式:
如果原图中存在以 \(r\) 为根的最小树形图,就输出最小树形图每条边的权值之和,否则输出 \(-1\) 。
输入输出样例
输入样例#1:
4 6 1
1 2 3
1 3 1
4 1 2
4 2 2
3 2 1
3 4 1
输出样例#1:
3
输入样例#2:
4 6 3
1 2 3
1 3 1
4 1 2
4 2 2
3 2 1
3 4 1
输出样例#2:
4
输入样例#3:
4 6 2
1 2 3
1 3 1
4 1 2
4 2 2
3 2 1
3 4 1
输出样例#3:
-1
说明
样例 \(1\) 解释
最小树形图中包含第 \(2\) , \(5\) , \(6\) 三条边,总权值为 \(1 + 1 + 1 = 3\)
样例 \(2\) 解释
最小树形图中包含第 \(3\) , \(5\) , \(6\) 三条边,总权值为 \(2 + 1 + 1 = 3\)
样例 \(3\) 解释
无法构成最小树形图,故输出 \(-1\) 。
数据范围
对于所有数据, \(1 \leq u, v \leq n \leq 100\) , \(1 \leq m \leq 10^4\) ,\(1 \leq w \leq 10^6\) 。
题解
最小树形图模板题,打板子就好了
如果你不会最小树形图,看这个图,或者看这里

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100+10,MAXM=10000+10,inf=0x3f3f3f3f;
int n,m,r,in[MAXN],bel[MAXN],vis[MAXN],pre[MAXN];
struct node{
int u,v,k;
};
node side[MAXM];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int solve(int rt,int n)
{
int res=0;
while(true)
{
for(register int i=1;i<=n;++i)in[i]=inf;
for(register int i=1;i<=m;++i)
if(side[i].u!=side[i].v&&in[side[i].v]>side[i].k)in[side[i].v]=side[i].k,pre[side[i].v]=side[i].u;
for(register int i=1;i<=n;++i)
if(i!=rt&&in[i]==inf)return -1;
int cnt=0;
memset(bel,0,sizeof(bel));
memset(vis,0,sizeof(vis));
in[rt]=0;
for(register int i=1,j;i<=n;++i)
{
res+=in[i];j=i;
while(j!=rt&&vis[j]!=i&&!bel[j])vis[j]=i,j=pre[j];
if(j!=rt&&!bel[j])
{
bel[j]=++cnt;
for(register int k=pre[j];k!=j;k=pre[k])bel[k]=cnt;
}
}
if(!cnt)break;
for(register int i=1;i<=n;++i)
if(!bel[i])bel[i]=++cnt;
for(register int i=1,u,v;i<=m;++i)
{
u=side[i].u,v=side[i].v;
side[i].u=bel[u],side[i].v=bel[v];
if(bel[u]^bel[v])side[i].k-=in[v];
}
n=cnt;
rt=bel[rt];
}
return res;
}
int main()
{
read(n);read(m);read(r);
for(register int i=1;i<=m;++i)
{
int u,v,k;read(u);read(v);read(k);
side[i]=(node){u,v,k};
}
write(solve(r,n),'\n');
return 0;
}
【刷题】洛谷 P4716 【模板】最小树形图的更多相关文章
- 洛谷.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 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P4126 [AHOI2009]最小割
题目:洛谷P4126 [AHOI2009]最小割 思路: 结论题 在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号.显然有id[s]!=id[t](否则s到t有通路,能继续 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
随机推荐
- JS Windows.document对象
四中选择器:class ,id , name , 标签 通过选择器获取对象: ...................................ClassName(''); -- class选择 ...
- Ubuntu系统python3版本设置问题
参照:https://blog.csdn.net/wangguchao/article/details/82151372
- 学习笔记之ubuntu修改固定IP脚本
一.shell脚本编程 二.正则表达式 三.linux修改IP的方法 #!/bin/bash cd /etc/network/ stty erase '^?' write_interfaces() { ...
- Jupyter 安装并配置工作路径[转]
1.通过python的pip方式安装jupyterpython和pip都安装好后,通过cmd进入命令提示窗口,找到python安装目录下的Script目录,例如我的是路径是:C:\Program Fi ...
- [二读]The Art of Pompeii's Influence on Neo-Classicism
The Art of Pompeii's Influence on Neo-Classicism The discovery of Pompeii's ruins in 1599 profoundly ...
- Java如何调用shell脚本的
有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...
- K8S-RedisCluster搭建
简介 Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接, mastart节点之间存放的数据并不是相同的,只是其中的一部分,当我们请 ...
- 53. [LeetCode] Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- 【Pthon入门学习】多级菜单小例子
menu_list = { '北京':{ '昌平':{ '回龙观':{ '和谐家园':{}, '矩阵小区':{}, '北店家园':{} }, '沙河':{ '北街家园1区':{}, '北街家园2区': ...
- 团队介绍&学长采访
1. 团队介绍 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔 我绝对不知道,我一个写代码的怎么就当PM去了? 张安澜 博客园ID:Mins ...