1934: [Shoi2007]Vote 善意的投票

题目:传送门

题解:

   明显的不能再明显的最小割。。。

   st连同意的,不同意的连ed

  朋友之间两两连边(即双向边)

   流量都为1...

   为啥:

   一个人只有两种选择...同意or不同意

   那么如果选择违背了个人意愿那么肯定要割掉一条边(起冲突了嘛),那就是流量啊...

   如果当前选择让两个盆友不在同一集合,那就产生了冲突,还是要割,还是流量啊...

   一A美滋滋~

代码水一发:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define qread(x) x=read()
  7. using namespace std;
  8. inline int read()
  9. {
  10. int f=,x=;char ch;
  11. while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
  12. while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
  13. return f*x;
  14. }
  15. struct node
  16. {
  17. int x,y,c,next,other;
  18. }a[];int len,last[];
  19. int n,m,st,ed;
  20. void ins(int x,int y,int c)
  21. {
  22. int k1,k2;
  23. k1=++len;
  24. a[len].x=x;a[len].y=y;a[len].c=c;
  25. a[len].next=last[x];last[x]=len;
  26.  
  27. k2=++len;
  28. a[len].x=y;a[len].y=x;a[len].c=;
  29. a[len].next=last[y];last[y]=len;
  30.  
  31. a[k1].other=k2;
  32. a[k2].other=k1;
  33. }
  34. int list[],h[],head,tail;
  35. bool bt_h()
  36. {
  37. memset(h,,sizeof(h));h[st]=;
  38. list[]=st;head=;tail=;
  39. while(head!=tail)
  40. {
  41. int x=list[head];
  42. for(int k=last[x];k;k=a[k].next)
  43. {
  44. int y=a[k].y;
  45. if(h[y]== && a[k].c>)
  46. {
  47. h[y]=h[x]+;
  48. list[tail++]=y;
  49. }
  50. }
  51. head++;
  52. }
  53. if(h[ed]>)return true;
  54. return false;
  55. }
  56. int find_flow(int x,int flow)
  57. {
  58. if(x==ed)return flow;
  59. int s=,t;
  60. for(int k=last[x];k;k=a[k].next)
  61. {
  62. int y=a[k].y;
  63. if(h[y]==h[x]+ && a[k].c> && s<flow)
  64. {
  65. s+=t=find_flow(y,min(a[k].c,flow-s));
  66. a[k].c-=t;a[a[k].other].c+=t;
  67. }
  68. }
  69. if(s==)h[x]=;
  70. return s;
  71. }
  72. int main()
  73. {
  74. qread(n);qread(m);
  75. len=;memset(last,,sizeof(last));
  76. st=-;ed=st+;
  77. for(int i=;i<=n;i++)
  78. {
  79. int x;qread(x);
  80. if(x==)ins(st,i,);
  81. else ins(i,ed,);
  82. }
  83. for(int i=;i<=m;i++)
  84. {
  85. int x,y;
  86. qread(x);qread(y);
  87. ins(x,y,);
  88. ins(y,x,);
  89. }
  90. int ans=;
  91. while(bt_h())ans+=find_flow(st,);
  92. printf("%d\n",ans);
  93. return ;
  94. }

bzoj1934: [Shoi2007]Vote 善意的投票(显然最小割)的更多相关文章

  1. BZOJ1934 [Shoi2007]Vote 善意的投票 【最小割】

    题目 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿 ...

  2. bzoj1934: [Shoi2007]Vote 善意的投票(最小割)

    传送门 考虑源点为同意,汇点为反对,那么只要源点向同意的连边,不同意的向汇点连边,求个最小割就是答案 然后考虑朋友之间怎么办,我们令朋友之间连双向边.这样不管怎么割都能对应一种选择情况.那么还是求一个 ...

  3. [BZOJ1934][SHOI2007]Vote 善意的投票:最小割

    分析 先讲一下连边方法: \(S\)向意愿同意的人,意愿反对的人向\(T\),朋友之间互相连(其实好像意愿不同的朋友之间互相连就可以了,嘛,不管了),容量均为\(1\). 最小割即为答案. 可以理解为 ...

  4. [bzoj1934/2768][Shoi2007]Vote 善意的投票_最小割

    Vote 善意的投票 bzoj-1934 Shoi-2007 题目大意:题目链接. 注释:略. 想法: 这是最小割的一个比较基本的模型. 我们将所有当前同意的小朋友连向源点,边权为1.不容易的连向汇点 ...

  5. BZOJ 1934 [Shoi2007]Vote 善意的投票(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1934 [题目大意] 每个人对于投票都有自己原来的观点:1或者0, 他可以违背自己原来的 ...

  6. 2018.10.13 bzo1934: [Shoi2007]Vote 善意的投票(最小割)

    传送门 最小割定义题. 按照题意建边就行了. 考虑把冲突变成把aaa选入不与自己匹配的集合所需要付出的代价. 然后跑最小割就行了. 代码: #include<bits/stdc++.h> ...

  7. bzoj 1934: [Shoi2007]Vote 善意的投票 (最小割)

    原来是赞同的连源,原来是反对的连汇,然后是朋友的就连在一起,这样最小割就是割掉违背和谐的吧 type arr=record toward,next,cap:longint; end; const ma ...

  8. bzoj1934: [Shoi2007]Vote 善意的投票

    最大流..建图方式都是玄学啊.. //Dinic是O(n2m)的. #include<cstdio> #include<cstring> #include<cctype& ...

  9. bzoj1934: [Shoi2007]Vote 善意的投票&&bzoj2768:[JLOI2010]冠军调查

    get到新姿势,最小割=最大流,来个大佬的PPT 这道题的做法是将st和1的xpy连,0的xpy和ed连,xpy之间jy连双向边,然后呢答案就是最小割. #include<cstdio> ...

随机推荐

  1. HDU 4318 Contest 2

    简单的一题,使用类DIJK的算法就可以了. #include <iostream> #include <cstdio> #include <queue> #incl ...

  2. ios中NSUserDefaults的使用方法

    ios中NSUserDefaults的使用方法 NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存.恢复应用程序相关的偏好设置,配置数据等 ...

  3. 个人andriod实习小作品,个人联网笔记本

    个人联网笔记本 个人信息:就读于燕大本科软件project专业 眼下大四; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将来从事算法工 ...

  4. iOS UI08_UITableView

    (http://img.blog.csdn.net/20150808103801391) // // MainViewController.m // UI08_UITableView // // Cr ...

  5. [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)

    题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...

  6. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  7. 如何将MVC AREA中的某一个页设为起始页

    public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.Ignore ...

  8. JavaScript中Array方法总览

    title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...

  9. Android eclipse 运行项目设置程序默认安装到SD卡

    Android eclipse 运行项目设置程序默认安装到SD卡  1.在Android手机启用USB调试功能 2.在Windows系统中打开命令提示符(开始菜单,选择运行,输入cmd回车即可),使用 ...

  10. 简易Servlet计算器1.0

    编写一个简易的Servlet计算器,暂时仅能实现 + - * / % 五种运算 jsp界面: <%@ page language="java" contentType=&qu ...