引用zky的题解:http://blog.csdn.net/iamzky/article/details/39667859

每条S-T路径代表一次比赛的结果。最小割会尽量让一个人赢得最多。

因为二分总是写挂,所以写了分块答案,比暴力枚举好像快不了多少。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<cmath>
  6. using namespace std;
  7. #define INF 2147483647
  8. #define MAXN 20011
  9. #define MAXM 100301
  10. int v[MAXM],cap[MAXM],en,first[MAXN],next[MAXM];
  11. int d[MAXN],cur[MAXN];
  12. queue<int>q;
  13. int n,m,S,T;
  14. void Init_Dinic(){memset(first,-1,sizeof(first)); en=0; S=0; T=n+m+1;}
  15. void AddEdge(const int &U,const int &V,const int &W)
  16. {v[en]=V; cap[en]=W; next[en]=first[U]; first[U]=en++;
  17. v[en]=U; next[en]=first[V]; first[V]=en++;}
  18. bool bfs()
  19. {
  20. memset(d,-1,sizeof(d)); q.push(S); d[S]=0;
  21. while(!q.empty())
  22. {
  23. int U=q.front(); q.pop();
  24. for(int i=first[U];i!=-1;i=next[i])
  25. if(d[v[i]]==-1 && cap[i])
  26. {
  27. d[v[i]]=d[U]+1;
  28. q.push(v[i]);
  29. }
  30. }
  31. return d[T]!=-1;
  32. }
  33. int dfs(int U,int a)
  34. {
  35. if(U==T || !a) return a;
  36. int Flow=0,f;
  37. for(int &i=cur[U];i!=-1;i=next[i])
  38. if(d[U]+1==d[v[i]] && (f=dfs(v[i],min(a,cap[i]))))
  39. {
  40. cap[i]-=f; cap[i^1]+=f;
  41. Flow+=f; a-=f; if(!a) break;
  42. }
  43. if(!Flow) d[U]=-1;
  44. return Flow;
  45. }
  46. int max_flow()
  47. {
  48. int tmp=0,Flow=0;
  49. while(bfs())
  50. {
  51. memcpy(cur,first,(n+m+5)*sizeof(int));
  52. while(tmp=dfs(S,INF)) Flow+=tmp;
  53. }
  54. return Flow;
  55. }
  56. int us[10001],vs[10001];
  57. void Rebuild(const int &x)
  58. {
  59. Init_Dinic();
  60. for(int i=1;i<=m;++i)
  61. {
  62. AddEdge(S,i,1);
  63. AddEdge(i,us[i]+m,1);
  64. AddEdge(i,vs[i]+m,1);
  65. }
  66. for(int i=1;i<=n;++i) AddEdge(i+m,T,x);
  67. }
  68. int main()
  69. {
  70. scanf("%d%d",&n,&m);
  71. for(int i=1;i<=m;++i) scanf("%d%d",&us[i],&vs[i]);
  72. int sz=sqrt(m); int last=0;
  73. for(int i=1;last<=m;i+=sz)
  74. {
  75. Rebuild(i);
  76. if(max_flow()>=m)
  77. {
  78. for(int j=last+1;j<=i;++j)
  79. {
  80. Rebuild(j);
  81. if(max_flow()>=m)
  82. {
  83. printf("%d\n",j);
  84. return 0;
  85. }
  86. }
  87. }
  88. last=i;
  89. }
  90. return 0;
  91. }

  

【分块答案】【最小割】bzoj1532 [POI2005]Kos-Dicing的更多相关文章

  1. UVA1389 Hard Life[二分答案+最小割]

    我真菜啊←地址 求最大密度子图方案.密度=边数/点数 假设E,V为最大密度子图的边数点数.则$\forall \rho$有$\rho \leqslant \frac{E}{V}$即$E- \rho V ...

  2. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  3. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  4. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  5. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

  6. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  7. 图的全局最小割的Stoer-Wagner算法及例题

    Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...

  8. 【HDU 5855】Less Time, More profit(网络流、最小割、最大权闭合子图)

    Less Time, More profit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  9. 【GCJ2008E】日程表 最小割

    Google Code Jam 2008 E 日程表 [题目描述] 热情的选手Sphinny正在看新一年的日程表,并发现已经安排了很多编 程竞赛.她将这一年的每一天都用以下三种方式之一在日程表上打标记 ...

随机推荐

  1. Consumer [分组背包]

    Consumer Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...

  2. fastjson解析服务端返回的数据

    1.配置依赖 //fastjson api 'com.alibaba:fastjson:1.2.44' 2.设计服务端返回的数据 {},{},{}]} 3.编写bean类,特别注意,要和服务端返回的类 ...

  3. LA2995 Image is everything

    蓝书P12 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm ...

  4. SVN 服务器安装及配置(WIN7)

    软件安装包 客户端: 服务端: 安装服务端 不整合 Apache 服务器可以忽略此选项. 安装程序会自动在path下配置好环境变量:D:\Subversion\bin; 查看是否安装成功: C:\Us ...

  5. Spring学习-- SpEL表达式

    Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{...} 作为定界符 , 所有在大括号中的字符都将被认为是 SpE ...

  6. 有关javamelody的配置

    一:前沿 在这里我学到了怎么来使用开源的东西,也第一次去接触有关性能方面检测的开源框架,javamelody是性能检测的,刚刚看的时候我什么都不知道的,但是自己接触了,才知道一点大概思路吧.下面来记载 ...

  7. CCCC练习即感

    字符串进行初始化时不能通过char a[10]={'\0'}来简单进行,写循环或者memset,亲测有效,以及初始化分好情况,用空格还是'\0',别乱搞. 有一个有意思的题,连续因子,从2开始,依次向 ...

  8. Codeforces Round #299 Div2 解题报告

    这场比赛并没有打现场,昨天晚上做了ABCD四道题,今天做掉了E题 以前还没有过切完一场比赛的所有题呢~爽~ A. Tavas and Nafas   Today Tavas got his test ...

  9. ShadowBroker公开的SMB远程命令执行漏洞修复

    有人不知道如何获得MS对应的补丁KB编号,可以看这篇文章了~ 漏洞编号为ms17-010,如何查看对应MS号的补丁已经安装: 下载微软官方的补丁信息列表(Microsoft Security Bull ...

  10. shell脚本之while for if 语句和编写计划任务

    关于while循环: while do done 例如 1.关于内存的实时操作: (1).vim a.sh (2).输入以下while循环 (3)../a.sh执行脚本 2.自加一的操作: (1).v ...