分析

发这篇博客的目的就是要让你们知道博主到底有多菜。

类似于[NOI2006]最大获利。(明明就是一模一样好吧!)

不知道怎么了,半秒就想到用网络流,却没想出怎么建图。

连这么简单的题都没做出来,我实在是太菜了。

反思反思!

简述一下建图方式:

把原图中的边看作点。

  1. S向每条边对应的的点连边,容量为边权。

  2. 每条边对应的点向这条边连接的两个点连边,容量为\(1e18\)。

  3. 每个原图中的点向T连边,容量为点权。

答案即为总边权-最小割。

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <cctype>
  7. #include <algorithm>
  8. #include <queue>
  9. #define rin(i,a,b) for(int i=(a);i<=(b);i++)
  10. #define rec(i,a,b) for(int i=(a);i>=(b);i--)
  11. #define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
  12. using std::cin;
  13. using std::cout;
  14. using std::endl;
  15. typedef long long LL;
  16. inline int read(){
  17. int x=0;char ch=getchar();
  18. while(ch<'0'||ch>'9') ch=getchar();
  19. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  20. return x;
  21. }
  22. const int MAXN=1005;
  23. int n,m,S,T;
  24. int ecnt=1,head[MAXN<<1];
  25. int a[MAXN];
  26. int dep[MAXN<<1],cur[MAXN<<1];
  27. LL maxflow,mincut;
  28. std::queue<int> q;
  29. struct Edge{
  30. int to,nxt;
  31. LL cap;
  32. }e[MAXN<<3];
  33. inline void add_edge(int bg,int ed,LL ca){
  34. ecnt++;
  35. e[ecnt].to=ed;
  36. e[ecnt].nxt=head[bg];
  37. e[ecnt].cap=ca;
  38. head[bg]=ecnt;
  39. }
  40. inline bool bfs(){
  41. memset(dep,0,sizeof dep);
  42. while(!q.empty()) q.pop();
  43. rin(i,1,T) cur[i]=head[i];
  44. dep[S]=1;
  45. q.push(S);
  46. while(!q.empty()){
  47. int x=q.front();
  48. q.pop();
  49. trav(i,x){
  50. int ver=e[i].to;
  51. if(!dep[ver]&&e[i].cap){
  52. dep[ver]=dep[x]+1;
  53. q.push(ver);
  54. }
  55. }
  56. }
  57. return dep[T]>0;
  58. }
  59. LL dfs(int x,LL pref){
  60. if(x==T||!pref) return pref;
  61. LL flow=0,temp;
  62. for(int &i=cur[x];i;i=e[i].nxt){
  63. int ver=e[i].to;
  64. if(dep[ver]!=dep[x]+1) continue;
  65. if(!(temp=dfs(ver,std::min(pref,e[i].cap)))) continue;
  66. pref-=temp;
  67. flow+=temp;
  68. e[i].cap-=temp;
  69. e[i^1].cap+=temp;
  70. if(!pref) return flow;
  71. }
  72. return flow;
  73. }
  74. inline void dinic(){
  75. while(bfs()) maxflow+=dfs(S,1e18);
  76. }
  77. int main(){
  78. n=read(),m=read();
  79. S=n+m+1,T=S+1;
  80. rin(i,1,n){
  81. a[i]=read();
  82. add_edge(m+i,T,a[i]);
  83. add_edge(T,m+i,0);
  84. }
  85. LL ans=0;
  86. rin(i,1,m){
  87. int u=read(),v=read();
  88. LL w=read();
  89. add_edge(S,i,w);
  90. add_edge(i,S,0);
  91. add_edge(i,m+u,1e18);
  92. add_edge(m+u,i,0);
  93. add_edge(i,m+v,1e18);
  94. add_edge(m+v,i,0);
  95. ans+=w;
  96. }
  97. dinic();
  98. mincut=maxflow;
  99. ans-=mincut;
  100. printf("%I64d\n",ans);
  101. return 0;
  102. }

[CF1082G]Petya and Graph:最小割的更多相关文章

  1. Petya and Graph(最小割,最大权闭合子图)

    Petya and Graph http://codeforces.com/contest/1082/problem/G time limit per test 2 seconds memory li ...

  2. CodeForces1082G Petya and Graph 最小割

    网络流裸题 \(s\)向点连边\((s, i, a[i])\) 给每个边建一个点 边\((u, v, w)\)抽象成\((u, E, inf)\)和\((v, E, inf)\)以及边\((E, t, ...

  3. CF1082G Petya and Graph(最小割,最大权闭合子图)

    QWQ嘤嘤嘤 感觉是最水的一道\(G\)题了 顺便记录一下第一次在考场上做出来G qwqqq 题目大意就是说: 给你n个点,m条边,让你选出来一些边,最大化边权减点权 \(n\le 1000\) QW ...

  4. poj2125Destroying The Graph(最小割+输出方案)

    题目请戳这里 题目大意:给一张有向图,现在要选择一些点,删掉图中的所有边.具体操作为:选择点i,可以选择删除从i出发的所有有向边或者进入i的所有有向边,分别有个代价ini和outi,求最小的代价删掉所 ...

  5. poj 2125 Destroying The Graph 最小割+方案输出

    构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), 连边 (a1,b2),容量为正无穷大 则该 ...

  6. CF1082G Petya and Graph

    题意 定义图权 = 图中边权总和 - 图中点权总和(空图的图权=0),求 n 个点 m 条边的无向图最大权子图. 把边看成点,这个点与两个原图中的点连边.直接最小割求最大闭合子图即可.

  7. POJ 2125 Destroying The Graph [最小割 打印方案]

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8311   Accepted: 2 ...

  8. Petya and Graph/最大权闭合子图、最小割

    原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...

  9. CF1082G:G. Petya and Graph(裸的最大闭合权图)

    Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n vertic ...

随机推荐

  1. Mailx安装与使用

    1.卸载sendmail与postfix yum -y install mailx 2.安装mailx yum -y remove sendmail postfix 3.配置mail.rc vim / ...

  2. 初涉Java

    一.学习内容总结 1.程序入口 但如果类的定义使用了public class声明,那么文件名必须与类名保持一致,使用了class定义的类,文件名称可以和类名称不同. 2.输出语句 3.print与pr ...

  3. CentOSLinux安装Docker容器

    Docker 使用 环境说明 CentOS 7.3(不准确地说:要求必须是 CentOS 7 64位) 不建议在 Windows 上使用 Docker 基本概念 官网:https://www.dock ...

  4. Hive-生成一个大文件(小文件合并)

    set hive.execution.engine=mr; --在 map-reduce 作业结束时合并小文件.如启用,将创建 map-only 作业以合并目标表/分区中的文件. set hive.m ...

  5. linux中文件IO

    一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...

  6. W10: Warning: Changing a readonly file 解决办法

    在linux上编辑文件的时候,明明是使用的root登录的,可是这种至高无上的权限在按下i的时候被那串红色错误亵渎了W10: Warning: Changing a readonly file. 困扰两 ...

  7. Java的同名属性、同名普通函数、同名静态函数,是否被覆盖

    作者按:虚拟函数的概念早就滚瓜烂熟了.但是今天面试发现:1.同名属性,2.同名普通函数,3.同名静态函数,是否被覆盖的问题.请看下面三个例子: 例子1:测试父类的属性是否存在和被完全覆盖class A ...

  8. vscode调试php

    xdebug调试vscode 下载xdebug.dll扩展库 php.ini配置 [XDebug] xdebug.remote_enable = xdebug.remote_autostart = z ...

  9. 【React 7/100 】 虚拟DOM和Diff算法

    虚拟DOM和Diff算法 React更新视图的思想是:只要state变化就重新渲染视图 特点:思路非常清晰 问题:组件中只有一个DOM元素需要更新时,也得把整个组件的内容重新渲染吗? 不是这样的 理想 ...

  10. java调用webservice接口 几种方法

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...