【图论,网络流】CF1525F Goblins And Gnomes
你在打怪。你有一个 \(n\) 个点 \(m\) 条边的 DAG,接下来会有 \(k\) 波怪来袭,第 \(i\) 波怪有 \(i\) 个,它们会各自选择走一条路径,要求它们所选的路径点不相交。如果某一波中所有点都被覆盖了,那你就输了。
你不能输。于是在第 \(i\) 波之前,你可以花费若干分钟备战,每分钟可以选一个点将它的入边或者出边全部删掉。给定 \(a_i,b_i\),如果你在第 \(i\) 分钟花了 \(x\) 分钟备战,则你在这一波的得分为 \(\max(0,a_i-b_ix)\)。
你想拿分。你的总得分为每一波的得分之和。在不输的前提下最大化这个总得分。输出方案。
\(n\le 500,m\le n(n-1)/2,k<n\)。
首先这个是最小不交链覆盖,直接拆点二分图,转化成二分图最大匹配。对于一张图,最小链覆盖的大小即为 \(n-\) 最大匹配大小。
然后考虑操作是什么,删去一个点的所有出边或所有入边?就是删掉二分图上的一个点!
问题变成了删点使得最大匹配减小。然后我们记起来一点,最大匹配 \(=\) 最小点覆盖!那么删掉最小点覆盖上一个点一定会使得最大匹配减小。因此一定有一种方案使得最大匹配减小。
怎么找到这个方案?考虑如果是左部点,合法的充要条件是删掉它之后不存在一条从 \(S\) 到它的匹配点的路径。然后又注意到一点,如果一个左部点合法,那么只有它的匹配点是指向它的,所以不存在 \(S\) 到它的匹配点的路径等价于不存在 \(S\) 到它的路径。于是我们就进行 \(n\) 轮 dfs,每轮 dfs 从 \(S\) 开始搜,找出一个 \(S\) 无法到达的左部点删掉(如果找不到就从 \(T\) 开始对称地搜,两者一定能找到其一)。找到要删的点之后记得把从它到 \(T\)(或从 \(S\) 到它)的流退掉。每删一个点只用花 \(O(n^2)\) 的时间遍历,这部分复杂度 \(O(n^3)\)。
然后得分是诈骗的。直接硬上一个 \(O(n^3)\) 的 dp 即可。前面这么麻烦是因为要输出方案。
总时间复杂度 \(O(n^3)\)。
点击查看代码
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int N=505,M=N*N; using ll = long long;
int n,m,S,T,K,head[N],nxt[M],to[M],dir[M],tot,vis[N],st[N],tp,lis[N],lcnt,num[N],g[N][N]; ll f[N][N];
bool dfs(int u,int o,function<bool(int)> Done){
vis[u]=1; if(Done(u)) return true;
for(int e=head[u];e;e=nxt[e]) if(dir[e]==o&&!vis[to[e]]){
st[++tp]=e; if(dfs(to[e],o,Done)) return true; else tp--;
}
return false;
}
void add(int x,int y){
nxt[++tot]=head[x]; head[x]=tot; to[tot]=y; dir[tot]=1;
nxt[++tot]=head[y]; head[y]=tot; to[tot]=x; dir[tot]=0;
}
bool ck(ll& x,ll y) { return x<y?x=y,true:false; }
int main(){
cin>>n>>m>>K; tot=1;
For(i,1,m){
int x,y; cin>>x>>y; x=x*2-1; y=y*2; add(x,y);
}
S=n*2+1,T=n*2+2; int tt=n;
For(i,1,n*2) i&1?add(S,i):add(i,T);
while(true){
tp=0; For(i,1,T) vis[i]=0;
if(!dfs(S,1,[&](int u){return u==T;})) break;
tt--; Rev(i,tp,1) dir[st[i]]^=1,dir[st[i]^1]^=1;
}
int ww=tt;
while(tt<=K){
tp=0; For(i,1,T) if(vis[i]!=-1) vis[i]=0;
dfs(S,1,[&](int){return false;});
int o=0; for(int i=1;i<2*n;i+=2) if(!vis[i]) { o=i; break; }
if(o==0){
tp=0; For(i,1,T) if(vis[i]!=-1) vis[i]=0;; dfs(T,0,[&](int){return false;});
for(int i=2;i<=2*n;i+=2) if(!vis[i]) { o=i; break; }
}
assert(o); num[tt++]=o;
tp=0; For(i,1,T) if(vis[i]!=-1) vis[i]=0;
if(o&1) assert(dfs(T,1,[&](int u){return u==o;})); else assert(dfs(S,0,[&](int u){return u==o;}));
Rev(i,tp,1) dir[st[i]]^=1,dir[st[i]^1]^=1;
vis[o]=-1;
}
memset(f,0xaf,sizeof(f)); f[0][0]=0;
For(i,1,K){
ll x,y; cin>>x>>y;
For(j,0,n) For(k,max(j,max(0,i-ww+1)),n){
if(ck(f[i][k],f[i-1][j]+max(0ll,x-(k-j)*y))) g[i][k]=j;
}
}
ll ans=f[0][1]; int j=-1; For(i,0,n) if(ck(ans,f[K][i])) j=i;
vector<int> Ans;
Rev(i,K,1){
Ans.push_back(0); int k=g[i][j];
while(j>k) Ans.push_back(num[--tt]),j--;
}
reverse(Ans.begin(),Ans.end());
cout<<Ans.size()<<'\n';
for(int x:Ans){
if(x==0) cout<<x<<' ';
else if(x&1) cout<<(x+1)/2<<' ';
else cout<<-x/2<<' ';
}
cout<<'\n';
return 0;
}
【图论,网络流】CF1525F Goblins And Gnomes的更多相关文章
- 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)
Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...
- 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)
题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- 图论--网络流--最大流 洛谷P4722(hlpp)
题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...
- 图论--网络流--费用流POJ 2195 Going Home
Description On a grid map there are n little men and n houses. In each unit time, every little man c ...
- 图论--网络流--费用流--POJ 2156 Minimum Cost
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
- 图论--网络流--最大流 HDU 2883 kebab(离散化)
Problem Description Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled ...
- 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)
Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...
- 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- 图论--网络流--最大流--POJ 1698 Alice's Chance
Description Alice, a charming girl, have been dreaming of being a movie star for long. Her chances w ...
随机推荐
- 释放千行百业数据价值,华为云DAYU有一套
摘要:结合数字化转型中行业面临的挑战及产品解决方案解读数据使能服务DAYU. 大禹(DAYU)治水是一个有美好寓意的故事,大禹汲取了父亲治水的经验教训,总结出一套行之有效的治水方法,对洪水进行治理疏导 ...
- 送你5个MindSpore算子使用经验
摘要:MindSpore给大家提供了很多算子进行使用,今天给大家简单介绍下常用的一些算子使用时需要注意的内容. 本文分享自华为云社区<[MindSpore易点通]算子使用经验总结>,作者: ...
- 中秋节,华为云AI送上超级大月亮制作教程,体验赢开发者键鼠套装
摘要:一键"Run in ModelArts",无需考虑计算资源.环境的搭建,简单运行代码,即可拥有你的超级大月亮,打造专属于你的梦幻中秋月夜. 本文分享自华为云社区<中秋节 ...
- AppCube视角浅析: 艾瑞咨询《2022年中国低代码行业研究报告》
摘要:近日,艾瑞咨询发布了<2022年中国低代码行业研究报告>,报告从企业数字化发展背景.低代码的发展路径.应用渗透.市场规模等方面进行深入研究分析,并洞察了发展趋势. 本文分享自华为云社 ...
- 印尼Widya Robotics携手华为云,让建筑工地安全看得见
摘要:AI落地效率提升30倍,实时智慧安全检测,全天候保障劳工人身安全. 本文分享自华为云社区<云上360行 丨 印尼Widya Robotics携手华为云,让建筑工地安全看得见>,作者: ...
- 华为云NFT云宝限量开抢,区块链技术为你的数字资产保驾护航
摘要:正是有这些底层的区块链技术支撑,才能让我们真正的"拥有"独属于自己的NFT数字资产. 本文分享自华为云社区<华为云独家NFT限量开抢,背后的这些技术你都知道吗?> ...
- vue2.x老项目typescript改造过程经验总结
前言: 关于Vue2.x 的TS改造,其实没有啥好说的. 对于vue-cli项目来说,从新跑一遍 vue create xxx-project ,选择Manually select features ...
- 火山引擎ByteHouse:一套方案,让OLAP引擎在精准投放场景更高效
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 由于流量红利逐渐消退,越来越多的广告企业和从业者开始探索精细化营销的新路径,取代以往的全流量.粗放式的广告轰炸 ...
- 升讯威周报与工时统计系统 V3
欢迎使用"升讯威周报与工时统计系统"本系统是一款适合各类型企业.机构.团队使用的周报填写.查询:工时上报.统计分析的软件. 本系统主要特点: 员工按周填写周报,录入工时:可区分项目 ...
- AtCoder ABC 164 (D~E)
比赛链接:Here ABC水题, D - Multiple of 2019 (DP + 分析) 题意: 给定数字串S,计算有多少个子串 \(S[L,R]\) ,满足 \(S[L,R]\) 是 \(2 ...