Yali 19 - 8 - 6 test T2 猪国(pig) 题解
T2 猪国
题⽬描述
猪国是⼀个由 \(n\) 个城市组成的国家。
国王意识到了“要致富,先修路”这句话的重要性,它决定⼤规模修路。不巧的是,猪国的
猪们不太会⼯程,于是只能请隔壁鸡国的鸡建狂魔来帮忙修路。鸡建狂魔看不起猪,于是随
便建设了 \(m\) 条单向的路。尽管如此,每条路还是产⽣了或多或少的价值。
路修好了,经济却上不来。国王经过调研,发现了道路的巨⼤缺陷。具体来说,猪⺠们⽅向
感不好,⼀旦存在若⼲条路能组成⼀个环,那么可怜的猪⺠就有可能在环⾥⾯绕来绕去,这
样甚⾄会产⽣反效果。
国王认为这不good。它决定改进这些路使得路再也不能组成环,这样就很good。
国王找到了鸡建狂魔要求售后服务,但鸡建狂魔只答应把若⼲条路反向,同时还要求收取费
⽤。国王不⽢⼼被任意宰割,经过谈判,总费⽤为被反向的路的价值的最⼤值。
鸡建狂魔保证有办法使路变得good。国王想知道把路变得good的最⼩费⽤。当然,如果这
些路本来就很good,那么说明国王的调研有问题,⾃然费⽤就是 0。
输⼊格式
第⼀⾏两个整数 \(n, m\)分别表⽰城市的数⽬和道路的数⽬。
接下来 ⾏,每⾏三个整数\(x , y , z\)表⽰这是⼀条从$ x \(城市单向到\) y \(城市的路,它的价值为\) z $。
输出格式
⼀⾏⼀个整数表⽰答案。
样例
Input 1
5 6
2 1 1
5 2 6
2 3 2
3 4 3
4 5 5
1 5 4
Output 1
2
Input 2
5
7
2 1 5
3 2 3
1 3 3
2 4 1
4 3 5
5 4 1
1 5 3
Output 2
3
数据范围
对于 30% 的数据,n,m <= 20 。
对于 60% 的数据,n,m <= 100 。
对于 100% 的数据,2 <= n, m < 1e5,1 <= x, y <= n, 1 <= z <= 1e9。
数据有梯度。
首先,我们看到出题人很(mo)有 (ming)道 (qi) 理(miao)的题解。
⼆分答案。把所有边权⼤于当前⼆分值的边拿出来建⼀个图。
有环就不⾏,否则就可以(⼩边都从拓扑序⼩点的连向拓扑序⼤的,⼀定没有环)。
但事实上,博主的思路是这样的。(事实上是一样的)
二分答案出一个值(data)(注意,这里的data是“被反向的路的价值的最⼤值”),边权大于这个data的边都不能动(边权小于data的您随意捣鼓)。于是乎就用这些不能动的边造一张图。好嘛,图造好了,拓扑一下,如果叼出来一个环,那显然不符合pig king的要求,那么就得吧data往上升,卡掉环内的一些边。(因为你想让这个图变成一个DAG,你至少得把这个图给摧毁)。哟,升多了,还得降。这样慢慢二分刨刨出来的data,就一定是最合适的data.这样做的话,时间复杂度是O(n log n),没问题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 1e5 + 5;
// n , m 的范围。
struct edge{int to, z;};
vector <edge> e[maxn];
// vector 存图
struct group{int u,v,w;}g[maxm];
// 用struct保存每一条边,以便二分时不断建图。
int n, m, x, y, z, cnt, ans;
//ans 是 最终的 data
void init(){
for(int i = 1;i <= n;i ++){
e[i].clear();
}
}
//每次建图之前需要清零
bool work(int limit){
//拓扑排序
queue <int> q;
int rd[maxn] = {0}, dot = 0;
//dot是拓扑确定顺序的点数的数量
init();
for(int i = 1;i <= m;i ++){
if(g[i].w > limit){
e[g[i].u].push_back((edge){g[i].v,g[i].w});
rd[g[i].v] ++;
}
}
//建图
for(int i = 1;i <= n;i ++){
if(rd[i] == 0){
dot ++;
q.push(i);
}
}
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = 0;i < e[x].size(); i ++){
int y = e[x][i].to;
rd[y] --;
if(rd[y] == 0){
q.push(y);
dot ++;
}
}
}
//标准的topsort过程
return dot == n;
//如果图中有环,那么有些点显然是无法确定顺序的,自然dot != n
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1;i <= m;i ++){
scanf("%d%d%d", &x, &y, &z);
g[++ cnt] = (group){x,y,z};
//记录边数
}
int l = 0, r = 1e9;
//二分data
while(l <= r){
int mid = l + r >> 1;//当前data
if(!work(mid)){//如果当前data都爆出了环,那更小的data您就别想了
l = mid + 1;
} else {
//如果可以的话,那就再更苛刻的范围内求data
r = mid - 1;
ans = mid;
}
}
cout << ans;
return 0;
}
Yali 19 - 8 - 6 test T2 猪国(pig) 题解的更多相关文章
- 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】
好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...
- Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...
- 洛谷P2482 [SDOI2010]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...
- 【SDOI2010】猪国杀 题解(模拟)
前言:嗅到了一丝头秃的味道…… ------------------ 题目链接 题目实在太长,变量也很多.建议至少读个三五遍再做题.不要忽略任何细节,不要想当然.(因为真正玩三国杀肯定不像猪一样出牌啊 ...
- Luogu2482 [SDOI2010]猪国杀 ---- 模拟
Luogu2482 [SDOI2010]猪国杀 题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 首先说一下代码的构思: 首先确定了所有 ...
- [BZOJ 1972][Sdoi2010]猪国杀
1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 364 Solved: 204[Submit][Status][D ...
- [洛谷P2482][SDOI2010]猪国杀
题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...
- BZOJ1972:[SDOI2010]猪国杀
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)
点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...
随机推荐
- JS删除微博
昨天晚上找回了10年注册的微博,现在瞅瞅,转发过很多傻吊的微博,关注了一堆营销号,不忍直视,动手删吧!开玩笑的,怎么可能手动! 查看自己的所有微博,F12----->console,负责下面代码 ...
- 【应用服务 App Service】App Service使用Git部署时,遇见500错误
问题描述 Azure App Service在部署的时候支持多种方式,如Zip,VS 2019, VS Code,或者是Git部署,当使用Git部署遇见500错误时,可以通过其他的部署方式来验证是否也 ...
- CVE-2017-6090&msf的基本使用(一)
渗透环境的搭建 phpcollab的下载:phpCollab-v2.5.1.zip 解压到www目录,给www目录权限,因为这个漏洞需要写的权限 chmod 777 wwww 基本环境 配置 mysq ...
- Luogu P4172 [WC2006]水管局长
题意 给定一个 \(n\) 个点 \(m\) 条边的图和 \(q\) 次操作,每次操作分为以下两种: 1 u v:查询 \(u\) 到 \(v\) 的一条路径使得边权最大的边的权值最小. 2 u v: ...
- 学习写简单的RPC框架demo
学习实现一个简单的RPC框架. 工程主要目录分级结构: rpc-common: 公共基础包,能力提供包 rpc-provider: 服务提供者 rpc-consumer:服务消费者 rpc-servi ...
- 看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 final 是 Java 中的关键字 ...
- 关于Java引用,你必须知道这些
引用 Java 虚拟机接管了所有的内存分配与回收工作,极大地减少了程序员的工作量和错误率.GC 在回收内存时,通常采用被称为可达性分析的算法判断一个对象是否可以回收.而在可达性分析中,对象的引用有着决 ...
- 【CF1445D】Divide and Sum 题解
题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...
- MobileNet——一种模型轻量化方法
导言 新的CNN网络的提出,提高了模型的学习能力但同时也带来了学习效率的降低的问题(主要体现在模型的存储问题和模型进行预测的速度问题),这使得模型的轻量化逐渐得到重视.轻量化模型设计主要思想在于设计更 ...
- Newton插值的C++实现
Newton(牛顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗日)插值法.其重点在于差商(Divided Difference)表的求解. 步骤1. 求解差商表,这里采用非递归法(看 ...