题链:

http://poj.org/problem?id=2125

题解:

最小割 + 输出割方案。
建图:
拆点,每个题拆为 i 和 i'分别表示其的入点和出点
建立超源 S和超汇 T。
S -> i :(outi[i]) 割了这个边相当于选择了 i-
i'-> T :(ini[i])  割了这个边相当于选择了 i+
u -> v':(INF)
然后求Dinic跑最大流求最小割。

至于求方案,首先显然割的边都和 S或 T相连。
从 S开始沿着非满载的边(包括反向边)dfs,对遇到的点打标记。
如果某个入点 i 没有被标记过,则输出 i -
如果某个出点 i'被标记过,则输出 i +

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #define MAXN 500
  6. #define MAXM 150000
  7. #define INF 0x3f3f3f3f
  8. using namespace std;
  9. struct Edge{
  10. int to[MAXM],cap[MAXM],nxt[MAXM],head[MAXN],ent;
  11. void Init(){
  12. ent=2;
  13. memset(head,0,sizeof(head));
  14. }
  15. void Adde(int u,int v,int w){
  16. to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
  17. to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;
  18. }
  19. int Next(int i,bool type){
  20. return type?head[i]:nxt[i];
  21. }
  22. }E;
  23. int cur[MAXN],d[MAXN],mark[MAXN];
  24. int N,M,S,T;
  25. int idx(int i,int k){
  26. return i+k*N;
  27. }
  28. bool bfs(){
  29. queue<int>q;
  30. memset(d,0,sizeof(d));
  31. d[S]=1; q.push(S); int u,v;
  32. while(!q.empty()){
  33. u=q.front(); q.pop();
  34. for(int i=E.Next(u,1);i;i=E.Next(i,0)){
  35. v=E.to[i];
  36. if(d[v]||!E.cap[i]) continue;
  37. d[v]=d[u]+1; q.push(v);
  38. }
  39. }
  40. return d[T];
  41. }
  42. int dfs(int u,int reflow){
  43. if(u==T||!reflow) return reflow;
  44. int flowout=0,f,v;
  45. for(int &i=cur[u];i;i=E.Next(i,0)){
  46. v=E.to[i];
  47. if(d[v]!=d[u]+1) continue;
  48. f=dfs(v,min(reflow,E.cap[i]));
  49. flowout+=f; E.cap[i^1]+=f;
  50. reflow-=f; E.cap[i]-=f;
  51. if(!reflow) break;
  52. }
  53. if(!flowout) d[u]=0;
  54. return flowout;
  55. }
  56. int Dinic(){
  57. int flow=0;
  58. while(bfs()){
  59. memcpy(cur,E.head,sizeof(E.head));
  60. flow+=dfs(S,INF);
  61. }
  62. return flow;
  63. }
  64. void DFS(int u){
  65. mark[u]=1;
  66. for(int i=E.Next(u,1);i;i=E.Next(i,0)){
  67. if(!E.cap[i]||mark[E.to[i]]) continue;
  68. DFS(E.to[i]);
  69. }
  70. }
  71. int main()
  72. {
  73. while(~scanf("%d%d",&N,&M)){
  74. memset(mark,0,sizeof(mark));
  75. S=2*N+1; T=2*N+2; E.Init();
  76. for(int i=1,x;i<=N;i++)
  77. scanf("%d",&x),E.Adde(idx(i,1),T,x);
  78. for(int i=1,x;i<=N;i++)
  79. scanf("%d",&x),E.Adde(S,idx(i,0),x);
  80. for(int i=1,u,v;i<=M;i++)
  81. scanf("%d%d",&u,&v),E.Adde(idx(u,0),idx(v,1),INF);
  82. int ans=Dinic(),num=0;
  83. printf("%d\n",ans);
  84. DFS(S);
  85. for(int i=1;i<=N;i++)
  86. num+=((!mark[i])+(mark[i+N]));
  87. printf("%d\n",num);
  88. for(int i=1;i<=N;i++) {
  89. if(!mark[i])printf("%d -\n",i);
  90. if(mark[i+N])printf("%d +\n",i);
  91. }
  92. }
  93. return 0;
  94. }

●POJ 2125 Destroying The Graph的更多相关文章

  1. poj 2125 Destroying The Graph (最小点权覆盖)

    Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS   Memory Limit: 65536K       ...

  2. POJ 2125 Destroying the Graph 二分图最小点权覆盖

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

  3. 图论(网络流,二分图最小点权覆盖):POJ 2125 Destroying The Graph

    Destroying The Graph   Description Alice and Bob play the following game. First, Alice draws some di ...

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

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

  5. POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)

    题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...

  6. POJ 2125 Destroying The Graph 二分图 最小点权覆盖

    POJ2125 题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值.问最小权值和的解决方案,要输出操作. ...

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

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

  8. POJ - 2125 Destroying The Graph (最小点权覆盖)

    题意:给一张图,现在要删去所有的边,删去一个点的所有入边和所有出边都有其对应\(W_{i+}\)和\(W_{i-}\).求删去该图的最小花费,并输出解 分析:简而言之就是用最小权值的点集去覆盖所有的边 ...

  9. 【POJ】【2125】Destroying the Graph

    网络流/二分图最小点权覆盖 果然还是应该先看下胡伯涛的论文…… orz proverbs 题意: N个点M条边的有向图,给出如下两种操作.删除点i的所有出边,代价是Ai.删除点j的所有入边,代价是Bj ...

随机推荐

  1. collections deque队列及其他队列

    from collections import deque dq = deque(range(10),maxlen=10) dq.rotate(3)#队列旋转操作接受一个参数N,让N>0时,队列 ...

  2. python array 使用创建10万浮点数

    from array import array from random floats = array('d',random((for i in range(10**7)) fp = open('flo ...

  3. oracle删除某个用户所有表(转)

    1. select   'Drop   table   '||table_name||';'             from   all_tables           where   owner ...

  4. 同一个页面同时拥有collectionView和navigationBar和tabBar时可能遇到的问题

    写一个页面的时候,遇到了页面加载时候collectionView的最下面少了49个像素的位置,切换去别的页面之后,再返回,又变回正常,多方求解无果后,发现原来是系统自带的适应功能导致的,加入以下代码即 ...

  5. python 面向对象设计思想发展史

    这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...

  6. Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇——多页面VueSSR+热更新Server)

    Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇--多页面VueSSR+热更新Server) @(HTML/JS) 这是Vue多页面框架系列文章的第二篇,上一篇(纯前 ...

  7. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  8. Nagios监控的部署与配置

    [安装Nagios] yum install -y httpd httpd-devel httpd-tools mysql mysql-devel mysql-server php php-devel ...

  9. flash上传文件,如何解决跨域问题

    今天同事遇到一个问题,我们有两个应用,一个后台应用,主要用于运营人员编辑文章,发布到官网:一个图片服务器应用,其他很多的应用上传的图片也会存放在这,还对外提供一些查询和管理api. 前者部署在back ...

  10. VCS使用学习笔记(1)——Verilog相关的仿真知识

    本文主要学习Verilog的仿真特性,以及仿真器对Verilog的处理,算是对Verilog知识的增量学习.本文内容与我的另一篇博文(http://www.cnblogs.com/IClearner/ ...