BZOJ1934: [Shoi2007]Vote 善意的投票

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

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


题解Here!

其实没有样例解释更好。。。样例解释把这个题弄鬼畜了。。。
其实应该是都投反对票。。。
这个题显然网络流。
我们可以将两种意见:赞成,反对,设为源汇点$S,T$。
对于每个人$x$,若投赞成票,连边$<S,x,1>$;否则连边$<x,T,1>$。
对于每对朋友$x,y$,我们连边$<x,y,1>,<y,x,1>$。
然后呢?
我们发现我们要割掉最少的边使得$S,T$在两个对立的集合中。
于是变成了最小割。
直接上板子。。。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#define MAXN 310
#define MAXM 200010
#define MAX 999999999
using namespace std;
int n,m,s,t,c=2;
int head[MAXN],deep[MAXN];
struct Edge{int next,to,w;
}a[MAXM];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline void add(int u,int v,int w){a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;a[c].to=u;a[c].w=0;a[c].next=head[v];head[v]=c++;
}
bool bfs(){int u,v;queue<int> q;for(int i=1;i<=t;i++)deep[i]=0;deep[s]=1;q.push(s);while(!q.empty()){u=q.front();q.pop();for(int i=head[u];i;i=a[i].next){v=a[i].to;if(a[i].w&&!deep[v]){deep[v]=deep[u]+1;if(v==t)return true;q.push(v);}}}return false;
}
int dfs(int x,int limit){if(x==t)return limit;int v,sum,cost=0;for(int i=head[x];i;i=a[i].next){v=a[i].to;if(a[i].w&&deep[v]==deep[x]+1){sum=dfs(v,min(a[i].w,limit-cost));if(sum>0){a[i].w-=sum;a[i^1].w+=sum;cost+=sum;if(cost==limit)break;}else deep[v]=-1;}}return cost;
}
int dinic(){int ans=0;while(bfs())ans+=dfs(s,MAX);return ans;
}
void init(){int x,y;n=read();m=read();s=n+1;t=n+2;for(int i=1;i<=n;i++){x=read();if(x)add(s,i,1);else add(i,t,1);}for(int i=1;i<=m;i++){x=read();y=read();add(x,y,1);add(y,x,1);}
}
int main(){init();printf("%d\n",dinic());return 0;
}

转载于:https://www.cnblogs.com/Yangrui-Blog/p/10465922.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. CentOS 7 SSH 免密登录的方法
  2. 06开始完整制作网站
  3. python使用matplotlib可视化间断条形图、使用broken_barh函数可视化间断条形图、可视化定性数据的相同指标在时间维度上的差异
  4. 易语言tcp多线程服务端客户端_从TCP协议到TCP通信的各种异常现象和分析
  5. Nginx Kafka数据生产接口
  6. 利用RTMP或RTSP实现跨平台一对一互动功能
  7. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...
  8. TensorFlow 教程 --进阶指南--3.1总览
  9. oracle建表时添加comment,MYSQL中创建表时可以直接声明comment,ORACLE中似乎不可以,那么oracle该怎样简明地声明comment...
  10. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
  11. SPSS 产生正交数据集
  12. 使用C++调用Socket接口实现简易TCP服务器
  13. dns提供商主机名_什么是FQDN?它和主机名有区别吗?
  14. ios和Android样式不兼容(待更新)
  15. ThinkPad E420升级之路
  16. 关于前端后台管理系统总结
  17. OB2263MP小知识
  18. 拼多多看似简单,为什么很多的新手商家却亏钱了呢?
  19. 第四次作业-微软必应词典客户端
  20. php laravel入口文件,Laravel学习教程之从入口到输出过程详解

热门文章

  1. ASP.NET HttpHandler加水印
  2. 深入了解JavaScript目录(持续更新)
  3. tensorflow自定义op_TensorFlow 自定义模型导出:将 .ckpt 格式转化为 .pb 格式
  4. java exec 关闭,Java学习之使用Runtime.exec()启动、关闭Tomcat
  5. 广东财经大学计算机专业学费,广东财经大学各专业一年至少需要交的学费
  6. java 表格添加监听_关于Oracle用java实时监听oracle对表的DML操作【技术贴】
  7. html 怎么设置时间函数,JavaScript日期函数 - 计时器、innerHTML
  8. 创建oracle管理用户名和密码是什么情况,Oracle创建时默认创建的用户以及密码
  9. coreldraw梯形校正_CorelDRAW改变用形状识别所绘制对象的轮廓
  10. 【渝粤教育】国家开放大学2018年春季 0133-21T大学物理 参考试题