1934: [Shoi2007]Vote 善意的投票

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 1796  Solved: 1094
[Submit][Status][Discuss]

Description

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

Input

第一行只有两个整数n,m,保证有2≤n≤300,1≤m≤n(n-1)/2。其中n代表总人数,m代表好朋友的对数。文件第二行有n个整数,第i个整数代表第i个小朋友的意愿,当它为1时表示同意睡觉,当它为0时表示反对睡觉。接下来文件还有m行,每行有两个整数i,j。表示i,j是一对好朋友,我们保证任何两对i,j不会重复。

Output

只需要输出一个整数,即可能的最小冲突数。

Sample Input

3 3
1 0 0
1 2
1 3
3 2

Sample Output

1

HINT

在第一个例子中,所有小朋友都投赞成票就能得到最优解

Source

Day2

[Submit][Status][Discuss]
题解:最小割等于最大流。源点表示0,汇点表示1,把每个小朋友拆成两个点x,y,如果他的选择是0,就从源点向x连边,如果他的选择是1,就从y向汇点连边,如果两个小朋友是朋友且他们的选择冲突,那么就从选0的小朋友向选1的小朋友连边。然后跑最大流。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 3000
#define inf 1000000000
using namespace std;
int n,m;
int point[N],next[N],belong[N],tot=-1,u[N],remain[N];
int p[N],last[N],cnt,v[N],maxn,cnt1[N],num1[N],deep[N],laste[N],cur[N];
void add(int x,int y,int z)
{  tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=z;  tot++; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;
}
int addflow(int s,int t)
{  int now=t; int ans=inf;  while(now!=s)  {  ans=min(ans,remain[last[now]]);  now=v[last[now]^1];  }  now=t;  while(now!=s)  {  remain[last[now]]-=ans;  remain[last[now]^1]+=ans;  now=v[last[now]^1];  }  return ans;
}
void bfs(int s,int t)
{  for (int i=s;i<=t;i++) deep[i]=t;  deep[t]=0;   queue<int> p; p.push(t);  while (!p.empty())  {  int now=p.front(); p.pop();  for (int i=point[now];i!=-1;i=next[i])  if (deep[v[i]]==t&&remain[i^1])  deep[v[i]]=deep[now]+1,p.push(v[i]);  }
}
int isap(int s,int t)
{  int maxflow=0;  bfs(s,t);  for (int i=s;i<=t;i++) cur[i]=point[i];  for (int i=s;i<=t;i++) num1[deep[i]]++;  int now=s;  while (deep[s]<t)  {  if (now==t)  {  maxflow+=addflow(s,t);  now=s;  }  int p=false;  for (int i=cur[now];i!=-1;i=next[i])  if (deep[v[i]]+1==deep[now]&&remain[i])  {  cur[now]=i;  p=true;  last[v[i]]=i;  now=v[i];  break;  }  if (!p)  {  int minn=t-1;  for (int i=point[now];i!=-1;i=next[i])  if (remain[i]) minn=min(minn,deep[v[i]]);  if (!--num1[deep[now]]) break;  deep[now]=minn+1;  num1[deep[now]]++;  cur[now]=point[now];  if (now!=s)  now=v[last[now]^1];  }  } return maxflow;
}
int main()
{freopen("a.in","r",stdin);scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&belong[i]);int num=2*n+2;tot=-1;memset(next,-1,sizeof(next));memset(point,-1,sizeof(point));for (int i=1;i<=n;i++){if (!belong[i])add(1,i+1,1);elseadd(i+n+1,num,1);}for (int i=1;i<=m;i++){int x,y; scanf("%d%d",&x,&y);if (belong[x]==belong[y]) continue;if (!belong[x]) add(x+1,y+n+1,1);else add(y+1,x+n+1,1);}printf("%d\n",isap(1,num));
}

bzoj 1934: [Shoi2007]Vote 善意的投票(最小割)相关推荐

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

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

  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. bzoj1934 [Shoi2007]Vote 善意的投票 最小割

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

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

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

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

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

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

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

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

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

  9. P2057 [SHOI2007]善意的投票 最小割

    题意大致就是有n个人有两种不同的意见并且有许多朋友,需要让朋友间尽可能的统一意见(少发生冲突),如果一个人违反自己的本意也算冲突,求最少的冲突... 很明显是最小割   跑最大流算出冲突数 两种意见可 ...

最新文章

  1. Spring官网改版后下载方式
  2. python—web页面操作之3种等待方式
  3. postgresql介绍,安装,启动
  4. vue路由守卫判断用户是否登录,如果没登陆就跳转到登录
  5. OSPF地址汇总配置
  6. 黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾
  7. 自定义View(未完待续)
  8. 32岁了学python来的及吗_现在27岁学python来得及吗?
  9. hyperterminal使用教程_如何在Win中安装使用超级终端HyperTerminal.doc
  10. 无法找到mac地址必须重启计算机_AB PLC | CPU或以太网模块重启DHCP请求
  11. 解决办法:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
  12. 图像任意角度旋转和翻转(C#)
  13. Python爬虫理论 | (2) 网络请求与响应
  14. ADSL 拨号代理的搭建
  15. html文本转成二进制,肿么把文本文件转换成二进制bin文件
  16. 嵌入式计算机系统简述,嵌入式系统简述
  17. Python网络爬虫基础
  18. Metasploit 【入门】
  19. 职业教育转型线上,机构要如何通过直播来引流获客?
  20. 提升线下零售企业的市场竞争力--数据分析

热门文章

  1. 《近匠》AR学校:从教育领域看增强现实机遇何在
  2. matlab如何看机器人末端坐标,关于RobotStudio中机器人末端位置的MATLAB仿真验证
  3. LinuxCNC与EtherCAT学习笔记(2)——安装LinuxCNC
  4. java核心技术卷I 第1-3章 笔记
  5. 如何实现国外域名调转到国内已备案ip
  6. 【设计模式】【结构型模式】装饰器模式
  7. stm32f429基于ymodem传输的bootloader
  8. P3200 [HNOI2009]有趣的数列 (巧妙转换,卡特兰数,分解质因数取模运算)
  9. 泡妞技术帖:一物降一物 金庸爷爷教你如何谈恋爱
  10. 2021最全的课程资源库