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

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

那么我用一个点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. shell脚本--初识CGI

    CGI按照百度百科的定义,如下: CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数 ...

  2. Centos 7 关闭selinux and firewall

    关闭selinx,重启生效 修改文件 /etc/selinux/config 修改 SELINUX=disabled getenforce #查selinux状态 setenforce #关闭seli ...

  3. PyCharm3.0默认快捷键

    PyCharm3.0默认快捷键(翻译的) 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + S ...

  4. [转帖]Stack的三种含义

    Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...

  5. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  6. [转帖]Linux 的静态库与动态库

    Linux下的静态库与动态库 2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多 个人分类: Linux学习笔记 所属专栏: Lin ...

  7. 【学亮开讲】Oracle内外连接查询20181119

    --内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...

  8. springboot+ELK+logback日志分析系统demo

    之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...

  9. JS 类型检测

    typeof 适合函数对象和基本类型的判断 typeof 100instanceof 适合判断对象类型 obj instanceof Object 基于原型链判断操作符,若做操作符不是对象,则会直接返 ...

  10. hadoop第一个例子

    Java.io.URL 1.编写java程序 package com.company; import java.io.IOException; import java.io.InputStream; ...