cf1061E Politics (费用流)
看到数据范围,考虑网络流..但考的时候完全不知道怎么建图
考虑流量表示选的点个数,费用表示选点的收益,跑最大费用最大流
那么我用一个点x表示某树中的询问点x,刨去它子孙询问点的子树后的子树
对于树1,连边S->x,流量为x的限定数-孩子询问的限定数,费用为0
对于树2,连边x->T,流量为x的限定数-孩子询问的限定数,费用为0
以限制数量
之后对于每个点,给它在树1中最近的询问祖先到树2中最近的询问祖先 连边,流量为1,费用为点权
表示选这个点
如果S的出流量和不等于T的入流量和,或者最后没跑满,则说明无解
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int teg[][maxn*][],tegh[][maxn],tect[];
int dem[][maxn],cfa[][maxn],rt[];
inline void adteg(int o,int a,int b){
teg[o][++tect[o]][]=b,teg[o][tect[o]][]=tegh[o][a],tegh[o][a]=tect[o];
teg[o][++tect[o]][]=a,teg[o][tect[o]][]=tegh[o][b],tegh[o][b]=tect[o];
}
struct Edge{
int b,l,c,ne;
}eg[maxn*];
int N,egh[maxn*],ect=,S=,T=;
int val[maxn],inl,outl; inline void ext(){
printf("-1\n");
exit();
} inline void adeg(int a,int b,int l,int c){
if(a==S) inl+=l;
if(b==T) outl+=l;
eg[++ect]=(Edge){b,l,c,egh[a]},egh[a]=ect;
eg[++ect]=(Edge){a,,-c,egh[b]},egh[b]=ect;
}
inline int dfs(int o,int x,int f,int cl){
if(dem[o][x]) cl=x;
cfa[o][x]=cl;
int n=;
for(int i=tegh[o][x];i;i=teg[o][i][]){
int b=teg[o][i][];if(b==f) continue;
n+=dfs(o,b,x,cl);
}
if(dem[o][x]){
if(dem[o][x]<n) ext();
if(o==) adeg(S,x,dem[o][x]-n,);
else adeg(x+N,T,dem[o][x]-n,);
return dem[o][x];
}return n;
} queue<int> q;
int dis[maxn*],ine[maxn*];
bool flag[maxn*]; inline bool spfa(){
CLR(dis,-);dis[S]=;
CLR(ine,);q.push(S);
while(!q.empty()){
int p=q.front();q.pop();
flag[p]=;
for(int i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;if(!eg[i].l) continue;
if(dis[b]<dis[p]+eg[i].c){
dis[b]=dis[p]+eg[i].c,ine[b]=i;
if(!flag[b]) q.push(b),flag[b]=;
}
}
}return dis[T]>=-1e9;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),rt[]=rd(),rt[]=rd();
for(i=;i<=N;i++)
val[i]=rd();
for(i=;i<N;i++) adteg(,rd(),rd());
for(i=;i<N;i++) adteg(,rd(),rd());
for(i=rd();i;i--){
int x=rd(),y=rd();
dem[][x]=y;
}for(i=rd();i;i--){
int x=rd(),y=rd();
dem[][x]=y;
}
dfs(,rt[],,);dfs(,rt[],,);
for(i=;i<=N;i++){
adeg(cfa[][i],cfa[][i]+N,,val[i]);
}
if(inl!=outl) ext();
int ans=;
while(spfa()){
int mi=1e9;
for(i=T;i!=S;i=eg[ine[i]^].b){
mi=min(mi,eg[ine[i]].l);
}ans+=mi*dis[T];
inl-=mi;
for(i=T;i!=S;i=eg[ine[i]^].b){
eg[ine[i]].l-=mi,eg[ine[i]^].l+=mi;
}
}
if(inl) ext();
printf("%d\n",ans);
return ;
}
cf1061E Politics (费用流)的更多相关文章
- CF1061E Politics E. Politics 解题报告
CF1061E Politics E. Politics 考虑利用树的性质,因为是子树问题,所以放到dfs序上. 只考虑一个树,问题是每个区间选恰好\(k\)个.因为区间其实是子树,所以区间要么包含, ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
- Codeforces 730I [费用流]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 174 Solved: 9 ...
随机推荐
- shell脚本--初识CGI
CGI按照百度百科的定义,如下: CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数 ...
- Centos 7 关闭selinux and firewall
关闭selinx,重启生效 修改文件 /etc/selinux/config 修改 SELINUX=disabled getenforce #查selinux状态 setenforce #关闭seli ...
- PyCharm3.0默认快捷键
PyCharm3.0默认快捷键(翻译的) 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + S ...
- [转帖]Stack的三种含义
Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...
- [转帖]linux下的X server:linux图形界面原理
linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...
- [转帖]Linux 的静态库与动态库
Linux下的静态库与动态库 2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多 个人分类: Linux学习笔记 所属专栏: Lin ...
- 【学亮开讲】Oracle内外连接查询20181119
--内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...
- springboot+ELK+logback日志分析系统demo
之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...
- JS 类型检测
typeof 适合函数对象和基本类型的判断 typeof 100instanceof 适合判断对象类型 obj instanceof Object 基于原型链判断操作符,若做操作符不是对象,则会直接返 ...
- hadoop第一个例子
Java.io.URL 1.编写java程序 package com.company; import java.io.IOException; import java.io.InputStream; ...