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 ...
随机推荐
- C++实现算法常用的STL---整理
algorithm min(a,b)和max(a,b) #include<iostream> #include<algorithm> using namespace std; ...
- 自签名证书 nginx tomcat
给Nginx配置一个自签名的SSL证书 - 廖雪峰的官方网站 https://www.liaoxuefeng.com/article/0014189023237367e8d42829de24b6eaf ...
- PHP之常用设计模式
在日常开放中,经常会用到一些设计模式,进行我们代码的优化处理,一个很好的设计思想 1) 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 ...
- MyBatis映射文件5
返回map Map<String,Object> getEmpByResMap(Integer id); <select id="getEmpByResMap&qu ...
- ajax获取值的两种方法
详细连接https://blog.csdn.net/a1102325298/article/details/80785143 ajax获得表单值的俩种方法 2018年06月23日 17:12:02 延 ...
- mycat - 水平分表
相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中.水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分 ...
- Python魔法方法(magic method)细解几个常用魔法方法(上)
这里只分析几个可能会常用到的魔法方法,像__new__这种不常用的,用来做元类初始化的或者是__init__这种初始化使用的 每个人都会用的就不介绍了. 其实每个魔法方法都是在对内建方法的重写,和做像 ...
- flask 保存文件到 七牛云
上篇文章队长讲述了如何把前端上传的文件保存到本地项目目录 本篇 讲述一下把前端上传的文件保存到 第三方存储(七牛云) 七牛云相关步骤思路: 首先 进去七牛云官网,注册并实名认证来获取一个七牛云账号和存 ...
- ASP.Net Post方式获取数据流的一种简单写法
public static string PostWebReq(string PostUrl, string ParamData, Encoding DataEncode) { ...
- JS 强制类型转化
在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...