[Luogu] 网络】的更多相关文章

https://www.luogu.org/problemnew/show/P3250 树链剖分 + 线段树 + 优先队列 要求未被影响的请求中最大的 所以每次将每条路径在整棵树上的补集的每个节点的优先队列加入该路径的权值 mid 敲错调了一上午 气炸... #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring>…
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 namespace 封装,感觉还好. #include <cstdio> #include <cstring> #include <queue> using std::min; using std::queue; const int MAXN=1010,MAXM=10010,IN…
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 思路 找循环节.答案即为 (循环节的长度\(-1\)) 对所有循环节求和. 如果只能交换相邻两个,那么就是求逆序对个数.因为交换相邻两个数字的效果是使逆序对个数\(-1\). Code #include <bits/stdc++.h> #define maxn 100010 using name…
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题解: 第一问所有的费用全按\(0\)建,跑完了之后很自然想到利用残余网络. 把\(n\)和一个新点\(T\)连边,然后原来的残量网络保留,在此基础上对于原来的每条边流量均按\(+\inf\)建,费用为原始费用再跑一遍即可. 时间复杂度\(O(MaxFlowMi…
P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 自己对最大流算法的理解: 通过bfs对剩余图进行分层,剩余图中有流量的边(cap>0)才能bfs,然后dfs找增广路(满足dis[v]==dis[u]+1&&cap(u,v)>0) 各种优化(基本是在dfs(s,flow)上做的)的实现思路: 多路增广 通过记录从s流出的各个边增广…
Luogu P3376 最大流是网络流模型的一个基础问题. 网络流模型就是一种特殊的有向图. 概念: 源点:提供流的节点(入度为0),类比成为一个无限放水的水厂 汇点:接受流的节点(出度为0),类比成为一个无限收水的小区 弧:类比为水管 弧的容量:类比为水管的容量:用函数\(c(x,y)\)表示弧\((x,y)\)的容量 弧的流量:类比为当前在水管中水的量:用函数\(f(x,y)\)表示弧\((x,y)\)的流量 弧的残量:即容量-流量 容量网络:对于一个网络流模型,每一条弧都给出了容量,则构成…
好像也没那么难写 LOJ #2547 Luogu P4517 题意 在一棵点仙人掌中等概率选择一个点集 求选出点集的斯坦纳树大小的期望 定义点仙人掌为不存在一个点在多个简单环中的连通图 斯坦纳树为在原图中连通给定点集的一棵生成树 点数不超过$ 200$ $ Solution$ 直接计算不太方便 我们转而考虑每条边的贡献 如果这条边不在环上则一定是割边 若这条边两边都有点被选择就会被计算贡献 如果这条边在环上比较复杂 对于一个环,我们选择的边的数量一定是环大小-最长没选中点的路径的长度 定义选中某…
怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个知道就可以让其它的城市都得知信息了. 因此我们把在一个强连通分量中的点都缩点,然后就得到一个DAG 然后我们只需要给入度为0的点传递信息即可 CODE #include<cstdio> #include<cstring> using namespace std; const int N…
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 先跑一个dinic求最大流(我懒着写ISAP或前弧优化) 再重新建图 跑一个mcmf求最小费用最大流 答案就出来了 细节见代码 #pragma GCC optimize("O3") #include <bits/stdc++.h> #define maxn 10005 #def…
题目链接:https://www.luogu.org/problemnew/show/P1262 注意: 1.缩点时计算出入度是在缩完点的图上用color计算.不要在原来的点上计算. 2.枚举出入度时是在缩完点的图上计算.枚举范围到num. #include <stack> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using nam…
题目链接:https://www.luogu.org/problemnew/show/P3376 #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <cstring> using namespace std; const int inf = 1e9; ; int n, m, s, t, deep[maxn], maxflow;…
题目 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000. 输入 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离.理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些…
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出格式: 一行,包含一个正整数,即为该网络的最大流. 输入输出样例 输入样例#1: 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1: 50…
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共有n所学校(n<=10000)已知他们实现设计好的网络共m条线路,为了保证高速,网络是单向的.现在请你告诉他们至少选几所学校作为共享软件的母机母鸡,能使每所学校都可以用上.再告诉他们至少要添加几条线路能使任意一所学校作为母机母鸡都可以使别的学校使用上软件. 输入格式 第一行一个整数n. 接下来n行每…
题面 中文题目,不解释: BZOJ传送门 Luogu传送门 分析 这题建图是显然的,拆点后iii和i′i'i′连容量为吞吐量的边,根据题目要求,111和nnn的吞吐量看作∞\infty∞. 然后用distdistdist表示到111的最小距离,对于满足dist[v]=dist[u]+w[u,v]dist[v]=dist[u]+w[u,v]dist[v]=dist[u]+w[u,v]的边,u′u'u′和vvv连容量为∞\infty∞的边.最后建一个超级源点和超级汇点,分别与111和n′n'n′连容…
https://www.luogu.org/problemnew/show/P2038 二维前缀和 #include <iostream> #include <cstdio> using namespace std; ; ; int A[N][N]; int d, T; #define gc getchar() inline int read() { ; char c = gc; ') c = gc; + c - ', c = gc; return x; } int main()…
题面:[模板]网络最大流 代码: #include<cstring> #include<cstdio> #include<iostream> #define min(a,b) ((a)<(b)?(a):(b)) using namespace std; inline int rd(){ ,f=;char c=getchar(); ; c=getchar();} +c-'; c=getchar();} return f*x; } ,maxm=(1e5)+; ,edg…
题目传送门!(luogu) 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这个学校(强联通中至少有一个学校)必须作为终端机,毕竟它收不到别的学校传来的,只能自给自足. 然后考虑问题二 “任意一个学校都能作为母鸡”?试想一下,任意选取一个学校作为终端,要使得其余所有学校都能收到,只能是全图联通.因此,找到出度为0和入度为0的缩点的个数取max就ok了.(即从出度为0的点连向入…
LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 连图都不用建出来. 不是传统的树形dp 因为子树的状态影响之后的决策 并且从下至上的话需要状压所有点的状态 从上之下的话代价难以统计. 观察图中的这张表格 容易发现有规律的事情 当 na<nb时 有A的一定付出代价 两个A的话就两倍 一个A的话就一倍 B的话不要代价. 容易转换成上述模型 于是 这…
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些间谍手中具体掌握了哪些…
传送门 考虑只有一个询问,怎么使用暴力枚举最快的得到答案.因为要求最大的,所以可以把链按权值从大往小排序,然后往后扫,找到一个没有交的就是答案,直接退出 一堆询问,可以考虑整体二分,先二分一个值\(mid\),然后从前往后扫,如果是加入/删除操作,并且权值\(> mid\)就把这个操作贡献记上;如果是询问,然后如果经过这个点的链个数\(\ne\)当前存在的链个数,说明答案\(>mid\),否则\(\le mid\) 然后剩下的套一个整体二分板子就好了.答案的话如果取值范围的\(l=r\),就可…
其实这道题根本没必要写,但为了测试vector+堆优化的Prim试一发. 再次觉得Prim和Dijkstra很像,堆优化版本也差不多. 和Dijkstra一样,Prim也是在之前的dis点中选取一个最短的,但不同是Prim是最短边长,而Dijkstra是到达该点的最短路长度. 既然是取最小的,堆自然就派上用场了. CODE #include<cstdio> #include<queue> #include<vector> #include<cstring>…
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再  $link$,  不然会输出Error 1的哦 Code #include<cstdio> #include<cstring> #include<algorithm> #define rd read() using namespace std; ; int n, m, col, Q; int read() { , p = ; char c = getchar…
Description 给出一个有向图, 要求出至少从哪几个点出发, 能不漏地经过所有节点. 再求出至少加几条边, 才能使图变成一个强联通分量 Solution 求出所有强联通分量, 形成一个有向无环图, 第一问题就是求出有多少强联通分量的入度为 $0$ 第二个问题就是求出 入度为$0 $和 出度为$0$  的强联通分量的数量  的 最大值, 想象一下就可以了. 在整个图都是强联通分量下, 第二个问题答案为 $0$. Code #include<cstdio> #include<cstr…
嘟嘟嘟 建图还是很明显的. 接着分两种情况: 1.图中不存在环:那么只要收买那些入度为0的点.如果这些点有的不能收买.就不能控制所有间谍. 2.图中存在环,那么对于这些在环中的点,我们只要收买数额最少的间谍. 于是我们用tarjan缩点:这样把第二种情况就变成了第一种情况. 所以大体流程是:用tarjan缩点,然后统计新图中入度为0的点愿意收买的数额.缩点的时候可以顺便维护每一个强联通分量的数额的最小值以及编号最小的节点. #include<cstdio> #include<iostre…
题目链接 这次坑我的是与或的结合顺序…… 开十个LCT记录一下即可.以上. #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<map> #define maxn 210050 #define maxc 12 using namespace std; inline long long rea…
题目链接 这题比较水,就是乱改改费用流模板.判断一下已经满流的边和没有满流的边,然后再改改最大流模板,然后把它们拼起来就是了. 话说这题第一遍90,然后撕烤一会发现自己yy的spfa扩容方式不允许反悔.然后改了一个貌似没什么用的地方,结果A了…… 但是改的那个地方貌似是真的没什么用啊…… #include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cs…
最大流模板成为另一个被攻克的模板题. 今天QDC给我讲了一下Dinic,感觉很好懂.于是为了巩固就把这道题A掉了. 核心思想就是不断BFS分层,然后不断DFS找增广路.找不到之后就可以把答案累加输出了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> inline long long read(){ ,f=; ch…
题目传送门 真是一道好题呀~~~~qwq 知道这题是tarjan,但是想了很久怎么用上强连通分量.因为样例们...它显然并不是一个强联通分量! (被样例迷惑的最好例子) 然后...就没有然后了...感觉自己被欺骗了.脑补了一些别的做法,向题解低头. $Sol$ 这个时候我们其实需要一些冷静分析.分情况讨论. 判断无解性.什么时候无解?当存在一个间谍既不能被收买也没有被其他间谍掌握自己的资料,则无解.我们在主函数进行tarjan操作时,是从能被收买的间谍开始找环的.那么最后递归结束,当存在间谍没被…
include include include include include include define db double using namespace std; const int N=1e5+10,M=2*N; int next[M],head[N],go[M],tot; inline void add(int u,int v){ next[++tot]=head[u];head[u]=tot;go[tot]=v; next[++tot]=head[v];head[v]=tot;go…