看到数据范围,考虑网络流..但考的时候完全不知道怎么建图

考虑流量表示选的点个数,费用表示选点的收益,跑最大费用最大流

那么我用一个点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 (费用流)的更多相关文章

  1. CF1061E Politics E. Politics 解题报告

    CF1061E Politics E. Politics 考虑利用树的性质,因为是子树问题,所以放到dfs序上. 只考虑一个树,问题是每个区间选恰好\(k\)个.因为区间其实是子树,所以区间要么包含, ...

  2. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  3. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  4. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  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 ...

  6. Codeforces 730I [费用流]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...

  7. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  8. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  9. 【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 ...

随机推荐

  1. bootstrap 弹窗或者提示框插件 bootstrap-growl 和bootstrap-notify

    Bootstrap简单好用的页面右上角咆哮提示框 - daidaineteasy的专栏 - CSDN博客https://blog.csdn.net/daidaineteasy/article/deta ...

  2. [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。

    web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...

  3. Spring Boot 框架学习 (一)配置并运行Spring Boot 框架

    下载开发工具: 下载完成打开以后,第一步检查环境 查看jdk是否配置: 接着一定要注意,maven通常情况下它是没有给你配置的,要自行配置: 右键新建: 然后依赖选择web.跟Mybatis就行了. ...

  4. mysql参数优化记录

    服务器参数16G内存,4核CPUvim /etc/my.cnf 原: back_log=170 max_connections=600 max_user_connections=0 thread_co ...

  5. JS--bom对象:borswer object model浏览器对象模型

    bom对象:borswer object model浏览器对象模型 navigator获取客户机的信息(浏览器的信息) navigator.appName;获得浏览器的名称 window:窗口对象 a ...

  6. MySQL in型子查询陷阱

    现在有两个表,table1和table2,table1有1千万数据(id 主键索引),table2有三条数据(uid字段 3,5,7): select * from table1 where id i ...

  7. How to install Lion on PC

    open 'InstallESD.dmg' open '/Volumes/Mac OS X Install ESD/BaseSystem.dmg' rm '/Volumes/Mac OS X Base ...

  8. java 中的包概念

    Java 中的包package, 就是电脑中的文件夹.我们平时在工作中,文件太多时,都会新建文件夹进行分类管理,java 中的包也是类似的道理,当我们的类太多时,也需要进行分类管理,这时我们就会把类文 ...

  9. Nginx 决策浏览器缓存是否有效

    expires指令是告诉浏览器过期时间 syntax:expires [modified] time; eopch | max | off; default : off context :http,s ...

  10. qss 的使用

    //设置样式表 QStringList qss; qss.append("QFrame{border:0px solid #00BB9E;}"); // qss.append(&q ...