Description

幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。 我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?

题解:

st->要睡觉的(流量为1)->ed(流量为0)

st->不要睡觉的(流量为0)->ed(流量为1)

好盆友互相连流量为1的边。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define inf 1e9
const int N=90310;
int n,m;
int st,ed;
struct node{int x,y,z,next,other;
}sa[N<<1];int len=0,first[N];
void ins(int x,int y,int z)
{len++;sa[len].x=x;sa[len].y=y;sa[len].z=z;sa[len].next=first[x];first[x]=len;sa[len].other=len+1;len++;sa[len].x=y;sa[len].y=x;sa[len].z=0;sa[len].next=first[y];first[y]=len;sa[len].other=len-1;
}
queue<int>q;
int h[N];
bool bt()
{  memset(h,0,sizeof(h));h[st]=1;  q.push(st);  while(!q.empty())  {  int x=q.front();q.pop();  for(int i=first[x];i!=-1;i=sa[i].next)  {  int y=sa[i].y;  if(sa[i].z>0&&h[y]==0)  {  h[y]=h[x]+1;  q.push(y);  }  }  }  if(h[ed]==0) return false;  return true;
}
int getans(int x,int f)
{  if(x==ed) return f;  int s=0,o;  for(int i=first[x];i!=-1;i=sa[i].next)  {  int y=sa[i].y;  if(sa[i].z>0&&h[y]==h[x]+1&&f>s)  {  o=getans(y,min(f-s,sa[i].z));  s+=o;  sa[i].z-=o;  sa[sa[i].other].z+=o;  }  }  if(s==0) h[x]=0;  return s;
}
int main()
{scanf("%d%d",&n,&m);st=0;ed=n+1;int x;memset(first,-1,sizeof(first));for(int i=1;i<=n;i++){scanf("%d",&x);if(x==0) ins(st,i,1),ins(i,ed,0);else ins(i,ed,1),ins(st,i,0);}int y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);ins(x,y,1);ins(y,x,1);}int ans=0;while(bt()){ans+=getans(st,inf);}printf("%d\n",ans);
}

1934: [Shoi2007]Vote 善意的投票相关推荐

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

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1796  Solved: 1094 [Submit ...

  2. ●BZOJ 1934 [Shoi2007]Vote 善意的投票

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1934 题解: 题目有点迷. S向为1的点连边,为0的点向T连边, 在有关系的两个点之间连双向 ...

  3. BZOJ 1934: [Shoi2007]Vote 善意的投票

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1934 求图的最小割=求一下图的最大流. #include <iostream> ...

  4. 【BZOJ 1934】 [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1205  Solved: 746 [Submit] ...

  5. 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割

    [BZOJ2768][JLOI2010]冠军调查 Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教 ...

  6. [bzoj1934][Shoi2007]Vote 善意的投票

    来自FallDream的博客,未经允许,请勿转载,谢谢. 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为 ...

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

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

  8. bzoj1934 [Shoi2007]Vote 善意的投票 最小割

    一上来容易想到缩点dp,但由于一个集合是没法用状态表示的,所以不能dp 然后就可以想到最小割,即通过割边和代价完成分配: 就比较好做了,默认选0就和0连边,默认选1就和1连边,朋友之间连边,如果在同一 ...

  9. [BZOJ1934][Shoi2007]Vote 善意的投票[最小割]

    建图方式: S->同意 ,反对->T 对于每一对好友连容量为1的边 #include <bits/stdc++.h> using namespace std; const in ...

最新文章

  1. 按对象某属性排序的几种方法
  2. Apple高规格推3232吋LCD面板XDR
  3. 合并多个文本文件方法
  4. 软件测试术语中英文对照(部分)
  5. 关于Vmware下NAT模式物理机无法ping通虚拟机但是可以上网的解决方法
  6. C++学习——内联函数
  7. “饮水机”:形象比喻 深入浅出理解RAID
  8. django之同源策略
  9. 分布式设计 —— 容错与主备
  10. DB2 SQLCODE=-803,SQLSTATE=23505,SQLERROR=1
  11. C++程序设计随笔(二)
  12. PowerMILL宏自动化编程视频教程
  13. (内附独家PPT)李岩:CynosDB高可用系统介绍
  14. 如何在Chrome(或任何浏览器)中编辑任何网页
  15. 老公给同办公室的女同事发红包,正常吗?
  16. mysql中开启binlog
  17. 开发以及团队管理方面的心得总结
  18. 华为od机考真题-高矮个子排队,算法第九讲-高频真题解析 II
  19. mysql本周 下周下月_mysql取今日,明天,工作日,周末,本周,下周,下月数据...
  20. [海明威]《乞力马扎罗的雪》灵魂上扬寻觅它永远的归宿

热门文章

  1. 【在线免费编程网站】提高编程实践能力,兼顾编程游戏娱乐,随时随地玩耍
  2. 哪所大学教php_世界大学排行榜盘点:THE排名中清华北大雄踞亚洲高校前2!内地大学十强分别是…...
  3. c语言打开文件失败,C / c ++文件打开读取和写入失败的几个常见错误.
  4. 数据库高可用架构 - pxc
  5. 关于layui、table数据表格请求异常回调函数
  6. iOS代码混淆原理初探
  7. Android Adapter接口的实现类总结
  8. Material studio 2017R2生成的模型文件导入WIN10中lammps遇到的小问题
  9. 备忘:解决Arcgis插值锯齿状
  10. git branch -D 大写的D 删除分支