计蒜客 91 地铁 HDU 5263 平衡大师(二分+网络流)

先说PPT的思路

PPT的思路源于这句话:
对每条边 (u, v),连一条 (u, v) 容量为 1,费用为 1 的边。如果
流了表示删去这条边。

流过原图上的边表示删去这条边意味着什么呢?
令dif[u]=u的出度-入度
在这里插入图片描述
如图,灰边表示原图上的边,初始状态没有流过任何边
因为原图没有边被删,所以dif[u]=-1

这时,如果有一流量为1的流流过边a,那么此流只能从u在原图上的出边流出,即有一流量为1的流流过了边2,代表原图中边2被删,dif[u]=dif[u]-1=-2

因此,s到u流一流量为Δx的流,dif[u]要-Δx

在这里插入图片描述
同理,如果有一流量为1的流流过边b,那么此流只能从u在原图上的入边流入,即有一流量为1的流流过了边1或边3,代表原图中边1或边3被删,dif[u]=dif[u]+1=0

因此,u到t流一流量为Δx的流,dif[u]要+Δx

这样,我们就将dif[u]值的变化量,转化成了流过(s,u)边或(u,t)边的流量

如此,限制入度与出度的差的绝对值的最大值就变得简单了
因此考虑二分答案

设v=入度与出度的差的绝对值的最大值,二分v,然后求最少需要删去多少的边,判断是否可行即可
在建图时,

1.若dif[u]>=v:则dif[u]要减去一个数x(x>=0,因为-v<=dif[u]-x<=v,所以dif[u]-v<=x<=dif[u]+v,从s到u连一条上界为dif[u]+v,下界为dif[u]-v,费用为0的边
2.-v<dif[u]<v:从s到u连一条上界为dif[u]+v,费用为0的边从u到t连一条上界为v-dif[u],费用为0的边
3.若dif[u]<=-v:从u到t连一条上界为v-dif[u],下界为-v-dif[u],费用为0的边

跑有源汇有上下界的最小费用最大流即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=60;
const int M=100005;
const int inf=0x7fffffff;
struct Edge{int u,v,f,w,nxt;
}edge[M<<1];
int s,t,ss,tt,S,T,head[N],cnt,inque[N],pre[N],dis[N];
queue<int> que;
int Q,n,m,K,a[M],b[M],dif[N];
void add(int u,int v,int f,int w){edge[cnt].u=u;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].f=f;edge[cnt].nxt=head[u];head[u]=cnt++;edge[cnt].u=v;edge[cnt].v=u;edge[cnt].w=-w;edge[cnt].f=0;edge[cnt].nxt=head[v];head[v]=cnt++;
}
bool spfa(){memset(dis,0x7f,sizeof(dis));memset(inque,0,sizeof(inque));memset(pre,-1,sizeof(pre));dis[S]=0;que.push(S);inque[S]=1;while(!que.empty()){int u=que.front();que.pop();inque[u]=0;for(int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].v;if(edge[i].f>0&&dis[v]>dis[u]+edge[i].w){dis[v]=dis[u]+edge[i].w;pre[v]=i;if(!inque[v]){que.push(v);inque[v]=1;}}}	}if(pre[T]==-1) return 0;return 1;
}
int EK(){int flow,ret=0;while(spfa()){flow=inf;int x=pre[T];while(x!=-1){flow=min(edge[x].f,flow);x=pre[edge[x].u];}x=pre[T];while(x!=-1){edge[x].f-=flow;edge[x^1].f+=flow;ret+=flow*edge[x].w;x=pre[edge[x].u];}}return ret;
}
bool check(int v){cnt=0;memset(head,-1,sizeof(head));s=n+1;t=n+2;ss=n+3;tt=n+4;add(t,s,inf,0);for(int i=1;i<=m;i++)add(a[i],b[i],1,1);for(int i=1;i<=n;i++){if(dif[i]>=v){add(s,i,2*v,0);add(ss,i,dif[i]-v,0);add(s,tt,dif[i]-v,0);//add(s,i,[dif[i]+v,dif[i]-v],0);//减法上下界 }else if(dif[i]>-v){add(s,i,dif[i]+v,0);//减法上界 add(i,t,v-dif[i],0);//加法上界 }else{add(i,t,2*v,0);add(ss,t,-v-dif[i],0);add(i,tt,-v-dif[i],0);//add(i,t,[v-dif[i],-v-dif[i]],0);//加法上下界 }}S=ss,T=tt;if(EK()<=K) return 1;return 0;
}
int main(){scanf("%d",&Q);for(int cas=1;cas<=Q;cas++){memset(dif,0,sizeof(dif));scanf("%d%d%d",&n,&m,&K);K=m-K;for(int i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);dif[b[i]]--;dif[a[i]]++;}int l=0,r=n,mid,ans;while(l<=r){mid=(l+r)/2;if(check(mid)){ans=mid;r=mid-1;}else l=mid+1;} printf("Case %d: %d\n",cas,ans);}return 0;
}

接下来是我自己的思考产物,还未验证

考虑如何转化 入度与出度之差
设原图每条边流量为1,入度与出度之差转化为一个点的流入量与流出量之差
此时图是不满足流量平衡的,所以对每个点,我们给少的流一个来处,多的流一个去处,
入度与出度之差就转化为从来处到节点的流(或从节点到去处的流的大小

顺着想下去,原图上的边有流流过,就代表选择了这条边,没有流流过,就代表边被删除

考虑如何求解

原题:最多k条边限制入度与出度之差的绝对值的最大值最小求最值
考虑二分答案入度与出度之差的绝对值变为限制(用限制流量实现),那么删去边数自然转为求的最值(用费用求),与d比较判断即可

update:
我的思路会产生一个问题,从源点到各节点的流的大小 代表 出度-入度, 从各节点到汇点的流的大小 代表 入度-出度,根据每个节点是出度大还是入度大,我们选择连(s,u)还是(u,t)(显然一个节点不能同时连两种边),但因为题目限制的是 出度与入度之差的绝对值,无论连哪种边,其下界都会是负数,目前我想到的唯一解决方法是将所有边的边界整体加上n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开关灯(jzoj 3926)

开关灯 jzoj 3926 题目大意 有一个nl的灯网&#xff0c;你可以把按某一列的灯的按钮&#xff0c;然后这一列开的关&#xff0c;关的开&#xff0c;你也可以把某一行的灯和别的行的灯调换&#xff0c;问从当前状态到目标状态最少按多少个按钮 输入样例 3 3 2 01 11 10 11 0…

P4254-[JSOI2008]Blue Mary开公司【李超树】

正题 题目链接:https://www.luogu.com.cn/problem/P4254 题目大意 要求支持操作 插入一条直线。询问一个纵坐标最高的在直线上的点。 解题思路 李超树的模板题&#xff0c;大概就是标记永久化&#xff0c;对于一个位置midmidmid&#xff0c;我们看一下它与标记点在midmidmi…

asp.net core 外部认证多站点模式实现

PS&#xff1a;之前因为需要扩展了微信和QQ的认证&#xff0c;使得网站是可以使用QQ和微信直接登录。github 传送门 。然后有小伙伴问&#xff0c;能否让这个配置信息&#xff08;appid&#xff0c; appsecret&#xff09;按需改变&#xff0c;而不是在 ConfigureServices 里面…

牛客网【每日一题】4月22日 K-th Number

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 65536K&#xff0c;其他语言131072K 64bit IO Format:%lld 题目描述 Alice are given an array A[1…N] with N numbers. Now Alice want to build an array B by a parameter K…

纪中B组模拟赛总结(2020.2.09)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3666lyflyflyf120120120303030000909090 总结 T1敲了个并查集&#xff0c;然后被卡了&#xff0c;正解是dfs&#xff0c;十分难懂&#xff0c;好在洛谷有原题&#xff08;有一点差别&#xff09;&#xff0c;看…

P6030-[SDOI2012]走迷宫【高斯消元,tarjan,期望dp】

正题 题面链接:https://www.luogu.com.cn/problem/P6030 题目大意 nnn个点的一张有向图&#xff0c;求起点到终点的期望步数。保证每个强连通分量大小不超过100100100。 解题思路 显然如果是强连通分量那么显然需要用高斯消元。 先把强连通用tarjantarjantarjan缩起来&#…

如何让敏捷软着陆?

背景当前&#xff0c;敏捷已经成为了2018的热词&#xff0c;执行敏捷研发模式的项目多数都是从瀑布模型转型过来的&#xff0c;瀑布模型是一套根深蒂固的传统流程&#xff0c;如果硬着陆的话&#xff0c;很容易折翼。笔者在各类项目敏捷实施过程中&#xff0c;总结了一些接地气…

牛客网【每日一题】4月24日 子序列

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小美有一个由n个元素组成的序列{a1,a2,a3,…,an}&#xff0c;她想知道其中有多少个子序列{ap1,ap2,…,apm}…

[AGC031E] Snuke the Phantom Thief(网络流)

考虑枚举偷的珠宝的个数k&#xff0c;且假设它们按照坐标大小排好了序&#xff08;x坐标排一次&#xff0c;y坐标排一次&#xff09;。 那么可以将条件转化一下&#xff0c; 在珠宝按x坐标排好序时&#xff0c; x坐标大于等于aia_iai​的最多取bib_ibi​个可以转化为取的前k−…

YL杯超级篮球赛(jzoj 1325)

YL杯超级篮球赛 jzoj1325 题目大意 给n个点&#xff0c;每一个点都有一个值&#xff08;aia_iai​&#xff09;,现在让你找出一个点&#xff0c;使∑i1n(∣X−xi∣∣Y−yi∣)ai\sum_{i1}^{n} (|X-x_i||Y-y_i|)a_i∑i1n​(∣X−xi​∣∣Y−yi​∣)ai​最小&#xff0c;输出此…

P6088-[JSOI2015]字符串树【可持久化Trie,LCA】

正题 题面链接:https://www.luogu.com.cn/problem/P6088 题目大意 nnn个点的一棵树&#xff0c;每条边上有一个字符串&#xff0c;求一条路径上有多少以询问字符串为前缀的字符串。 解题思路 建立一个可持久化TrieTrieTrie&#xff0c;然后每个点继承父亲插入字符串。 然后询…

牛妹的游戏

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 UPD:数据保证不会有两条控制链控制的据点完全相同&#xff0c;也保证不会有某条控制链两端控制的据点相同…

.NET Core使用NLog通过Kafka实现日志收集

一、前言NET Core越来越受欢迎&#xff0c;因为它具有在多个平台上运行的原始.NET Framework的强大功能。Kafka正迅速成为软件行业的标准消息传递技术。这篇文章简单介绍了如何使用.NET(Core)和Kafka实现NLog的Target。在日常项目开发过程中&#xff0c;Java体系下Spring Boot …

[清华集训2017]无限之环(网络流)

很妙的一道题 对于每个格子&#xff0c;它合法与否&#xff0c;只跟它上下左右的相邻格子有关&#xff0c;所以可以想到黑白染色 &#xff08;用 (i,j) 表示 i 行 j 列的格子&#xff0c;我把 (ij) %2 0 的格子染成白色&#xff0c;把(ij)%2 1 的格子染成黑色&#xff09; …

【ST表】【单调队列】Window(jzoj 1326)

Window jzoj 1326 题目大意 给你一个序列a和一个数k&#xff0c;让你求a中所有长为k的子序列的最大值和最小值 输入样例 8 3 1 3 -1 -3 5 3 6 7输出样例 -1 -3 -3 -3 3 3 3 3 5 5 6 7数据范围 2020%&#xff1a; n\leqslant 500; 50%: n\leqslant 100000;20 100100%: n\l…

牛客网 【每日一题】4月23日题目精讲 边的染色

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小团有一张n个点&#xff0c;m条边的无向图G&#xff0c;有些边上已经被标记了0或1&#xff0c;表示它的边权…

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具&#xff08;GitHub&#xff09;&#xff0c;也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的&#xff0c;也就是说实体类和SQL语句都要自己写&#xff0c;但它提供自动对象映射。是通过对IDbConnection接口…

P1446-[HNOI2008]Cards【Burnside引理,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1446 题目大意 三个颜色的一些东西排在一起&#xff0c;给mmm种置换&#xff0c;求本质不同的染色方案数。 解题思路 BurnsideBurnsideBurnside引理&#xff1a;置换集合GGG时本质不同的序列方案等于∑x∈Gc(x)∣G∣\frac{\…

传送门(最短路树+可并堆)

Description 有一张n个点m条边的无向图&#xff0c;求删去任意一条边后&#xff0c;从S到T的最短距离的最大值 n, m ≤ 21052 \times 10^52105 Solution 这道题是[USACO09JAN]Safe Travel的变形&#xff0c;然后这是题解 Safe Travel这道题的普遍做法是并查集或树剖&#…

【DP】Mobile Service(jzoj 1327)

Mobile Service jzoj 1327 题目大意 某公司有三个员工&#xff0c;现在有n个时刻&#xff0c;某一时刻要一个员工到一个位置&#xff08;别的员工不能动&#xff09;&#xff0c;代价为ci,jc_{i,j}ci,j​&#xff0c;一个位置一个时刻最多有一个人&#xff0c;问最小代价是多…