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 ...
随机推荐
- mysql 5.7:show_compatibility_56
show_compatibility_56 - rudy gao - CSDN博客 https://blog.csdn.net/rudygao/article/details/50403107 [SO ...
- 简述HTTP协议
引言 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/IP 协议通信协议 ...
- vue组件star开发基于vue-cli
<template> <div class="stars"> <div v-for="(item,ind) in num" :ke ...
- laravel belongsTo使用
前提:订单表(order)和用户表(user) 表结构: order CREATE TABLE `order` ( `id` char(16) COLLATE utf8mb4_unicode_ci N ...
- composer 自动加载一 通过file加载
github地址 https://github.com/brady-wang/composer composer init 可以生成一个composer.json文件 { "name&quo ...
- AngularJS集合数据遍历显示
AngularJS集合数据遍历显示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- java中级——二叉树比较冒泡和选择排序
上次我们说到二叉树排序比较,给出如下的题目 题目:创建五万个随机数,然后用分别用冒泡法,选择法,二叉树3种排序算法进行排序,比较哪种更快 废话不说直接上源码,可以看控制台结果 注意的是 需要我们需要上 ...
- python爬虫之Phantomjs安装和使用
phantomjs: PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG. phantom ...
- windows10企业版2016长期服务版激活
win10 2016 长期服务版的ISO文件中本身就带有KMS激活KEY,不用输入任何KEY,连接网络进入CMD,只要输入:slmgr /skms kms.digiboy.irslmgr /ato这两 ...
- AVL树,红黑树
AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...