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

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

那么我用一个点x表示某树中的询问点x,刨去它子孙询问点的子树后的子树

对于树1,连边S->x,流量为x的限定数-孩子询问的限定数,费用为0

对于树2,连边x->T,流量为x的限定数-孩子询问的限定数,费用为0

以限制数量

之后对于每个点,给它在树1中最近的询问祖先到树2中最近的询问祖先 连边,流量为1,费用为点权

表示选这个点

如果S的出流量和不等于T的入流量和,或者最后没跑满,则说明无解

  1. #include<bits/stdc++.h>
  2. #define CLR(a,x) memset(a,x,sizeof(a))
  3. #define MP make_pair
  4. using namespace std;
  5. typedef long long ll;
  6. typedef unsigned long long ull;
  7. typedef pair<int,int> pa;
  8. const int maxn=;
  9.  
  10. inline ll rd(){
  11. ll x=;char c=getchar();int neg=;
  12. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  13. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  14. return x*neg;
  15. }
  16.  
  17. int teg[][maxn*][],tegh[][maxn],tect[];
  18. int dem[][maxn],cfa[][maxn],rt[];
  19. inline void adteg(int o,int a,int b){
  20. teg[o][++tect[o]][]=b,teg[o][tect[o]][]=tegh[o][a],tegh[o][a]=tect[o];
  21. teg[o][++tect[o]][]=a,teg[o][tect[o]][]=tegh[o][b],tegh[o][b]=tect[o];
  22. }
  23. struct Edge{
  24. int b,l,c,ne;
  25. }eg[maxn*];
  26. int N,egh[maxn*],ect=,S=,T=;
  27. int val[maxn],inl,outl;
  28.  
  29. inline void ext(){
  30. printf("-1\n");
  31. exit();
  32. }
  33.  
  34. inline void adeg(int a,int b,int l,int c){
  35. if(a==S) inl+=l;
  36. if(b==T) outl+=l;
  37. eg[++ect]=(Edge){b,l,c,egh[a]},egh[a]=ect;
  38. eg[++ect]=(Edge){a,,-c,egh[b]},egh[b]=ect;
  39. }
  40. inline int dfs(int o,int x,int f,int cl){
  41. if(dem[o][x]) cl=x;
  42. cfa[o][x]=cl;
  43. int n=;
  44. for(int i=tegh[o][x];i;i=teg[o][i][]){
  45. int b=teg[o][i][];if(b==f) continue;
  46. n+=dfs(o,b,x,cl);
  47. }
  48. if(dem[o][x]){
  49. if(dem[o][x]<n) ext();
  50. if(o==) adeg(S,x,dem[o][x]-n,);
  51. else adeg(x+N,T,dem[o][x]-n,);
  52. return dem[o][x];
  53. }return n;
  54. }
  55.  
  56. queue<int> q;
  57. int dis[maxn*],ine[maxn*];
  58. bool flag[maxn*];
  59.  
  60. inline bool spfa(){
  61. CLR(dis,-);dis[S]=;
  62. CLR(ine,);q.push(S);
  63. while(!q.empty()){
  64. int p=q.front();q.pop();
  65. flag[p]=;
  66. for(int i=egh[p];i;i=eg[i].ne){
  67. int b=eg[i].b;if(!eg[i].l) continue;
  68. if(dis[b]<dis[p]+eg[i].c){
  69. dis[b]=dis[p]+eg[i].c,ine[b]=i;
  70. if(!flag[b]) q.push(b),flag[b]=;
  71. }
  72. }
  73. }return dis[T]>=-1e9;
  74. }
  75.  
  76. int main(){
  77. //freopen("","r",stdin);
  78. int i,j,k;
  79. N=rd(),rt[]=rd(),rt[]=rd();
  80. for(i=;i<=N;i++)
  81. val[i]=rd();
  82. for(i=;i<N;i++) adteg(,rd(),rd());
  83. for(i=;i<N;i++) adteg(,rd(),rd());
  84. for(i=rd();i;i--){
  85. int x=rd(),y=rd();
  86. dem[][x]=y;
  87. }for(i=rd();i;i--){
  88. int x=rd(),y=rd();
  89. dem[][x]=y;
  90. }
  91. dfs(,rt[],,);dfs(,rt[],,);
  92. for(i=;i<=N;i++){
  93. adeg(cfa[][i],cfa[][i]+N,,val[i]);
  94. }
  95. if(inl!=outl) ext();
  96. int ans=;
  97. while(spfa()){
  98. int mi=1e9;
  99. for(i=T;i!=S;i=eg[ine[i]^].b){
  100. mi=min(mi,eg[ine[i]].l);
  101. }ans+=mi*dis[T];
  102. inl-=mi;
  103. for(i=T;i!=S;i=eg[ine[i]^].b){
  104. eg[ine[i]].l-=mi,eg[ine[i]^].l+=mi;
  105. }
  106. }
  107. if(inl) ext();
  108. printf("%d\n",ans);
  109. return ;
  110. }

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. C#设计模式之2:单例模式

    在程序的设计过程中很多时候系统会要求对于某个类型在一个应用程序域中只出现一次,或者是因为性能的考虑,或者是由于逻辑的要求,总之是有这样的需求的存在,那在设计模式中正好有这么一种模式可以来满足这样的要求 ...

  2. findBugs安装

    点击“Help->InstallNew Software”,如下图所示: 2 接着如下图所示: 3 Name”输入“findBugs”,“Location”输入“http://findbugs. ...

  3. [转帖]cnblog 新闻 : 亚太云计算市场报告:腾讯位列前五 份额首超谷歌

    亚太云计算市场报告:腾讯位列前五 份额首超谷歌 投递人 itwriter 发布于 2019-03-18 12:06 评论(1) 有213人阅读 原文链接 [收藏] « » 美国市场研究机构 Syner ...

  4. js的日期操作:String转date日期格式、求日期差

    一.在js中String类型转成date格式 var date = new Date("2018-9-21 14:58:43");//就是这么简单 二.date转String类型就 ...

  5. C# Note7:MVVM模式之数据绑定

    一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文  数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM( ...

  6. Flutter 常用工具类库common_utils

    地址:https://pub.flutter-io.cn/packages/common_utils#-readme-tab- Dart常用工具类库 common_utils 1.TimelineUt ...

  7. Java基础——对象容器(顺序、集合、Hash)

    扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...

  8. NIO和经典IO

    NIO未必更快,在Linux上使用Java6完成的测试中,多线程经典I/O设计胜出NIO30%左右 异步I/O强于经典I/O:服务器需要支持超大量的长期连接,比如10000个连接以上,不过各个客户端并 ...

  9. StatefulSet

    StatefulSet: 1.稳点且唯一的网络标识符 2.稳点且持久的存储 3.有序.平滑的部署和扩展 4.有序.平滑的删除和终止 5.有序的滚动更新 三个组件组成:headless(无头服务)    ...

  10. DAY02、正式介绍python

    一.编程语言介绍(***) 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是直接控制硬件 1.3.高级语言:用人类能 ...