题目戳我

题目描述

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

我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?

输入输出格式

输入格式:

文件的第一行只有两个整数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不会重复。

输出格式:

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

输入输出样例

输入样例#1

3 3

1 0 0

1 2

1 3

3 2

输出样例#1

1

说明

2≤n≤300,1≤m≤n(n-1)/2。

题解

很显然每个人只有两种最终决策:同意或者是反对。那么我们很自然地想到依据这个把所有人划分成两个集合,使划分代价最小。这就是一个经典的最小割模型。

我们设与\(S\)相连的是投同意票的小朋友,与\(T\)相连的是投反对票的小朋友,那么所有小朋友与自己本来意愿对应的那个\(S\)或\(T\)连一条1的边,表示若他要改变本来意愿就要付出1的代价。有好朋友关系的两个人相互连边,容量为1,表示如果两个人的集合归属不同(没有投相同的票),就要付出1的代价。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 1000000000
const int _ = 100005;
struct edge{int to,next,w;}a[_<<1];
int n,m,s,t,head[_],cnt=1,cur[_],dep[_],ans;
queue<int>Q;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return w?x:-x;
}
void link(int u,int v,int w)
{
a[++cnt]=(edge){v,head[u],w};
head[u]=cnt;
a[++cnt]=(edge){u,head[v],w};
head[v]=cnt;
}
int bfs()
{
memset(dep,0,sizeof(dep));
Q.push(s);dep[s]=1;
while (!Q.empty())
{
int u=Q.front();Q.pop();
for (int e=head[u];e;e=a[e].next)
if (!dep[a[e].to]&&a[e].w)
dep[a[e].to]=dep[u]+1,Q.push(a[e].to);
}
return dep[t];
}
int dfs(int u,int flow)
{
if (u==t)
return flow;
int ret=0;
for (int &e=cur[u];e;e=a[e].next)
if (dep[a[e].to]==dep[u]+1&&a[e].w)
{
int temp=dfs(a[e].to,min(a[e].w,flow));
flow-=temp;ret+=temp;
a[e].w-=temp;a[e^1].w+=temp;
}
return ret;
}
int main()
{
n=gi();m=gi();s=n+1;t=s+1;
for (int i=1;i<=n;i++)
{
int c=gi();
if (c) link(s,i,1);else link(i,t,1);
}
while (m--)
{
int i=gi(),j=gi();
link(i,j,1);link(j,i,1);
}
while (bfs())
{
for (int i=1;i<=t;i++) cur[i]=head[i];
while (int temp=dfs(s,inf)) ans+=temp;
}
printf("%d\n",ans);
return 0;
}

[Luogu2057]善意的投票的更多相关文章

  1. C++之路进阶——bzoj1934(善意的投票)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

  2. BZOJ-1934 Vote 善意的投票 最大流+建图

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

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

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

  4. BZOJ 1934: [Shoi2007]Vote 善意的投票 最小割

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnl ...

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

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  6. 【BZOJ1934】善意的投票(网络流)

    [BZOJ1934]善意的投票(网络流) 题面 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己 ...

  7. BZOJ_1934_[Shoi2007]Vote 善意的投票

    BZOJ_1934_[Shoi2007]Vote 善意的投票 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然 ...

  8. 洛谷P2057 【SHOI2007】善意的投票

    洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...

  9. 洛谷 P2057 [SHOI2007]善意的投票 解题报告

    P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...

随机推荐

  1. zabbix邮件报警设置

    第一.安装邮件发送工具mailx 这里我选择的是mailx,所以的关闭其他的邮件发送工具 service sendmailstop #关闭   chkconfig sendmailoff #禁止开机启 ...

  2. 安装kvm模块配置网络

    1. vmware安装centos6.6 64位 (略) 其中有几个注意的地方:a. 内存给2gb. 磁盘给50g, 或者再单独分一个磁盘,用来存储虚拟机文件c. 最关键的一步,在创建虚拟机时,cpu ...

  3. Linux中7个用来浏览网页和下载文件的命令

    上一篇文章中,我们提到了rTorrent.wget.cURL.w3m.Elinks等几个有用的工具,很多人回信说还有其它几个类似的工具也值得讨论,所以就有了这篇文章.如果错过了第一部分的讨论,可以通过 ...

  4. Docker Centos7 下建立 Docker 桥接网络

    为什么要让docker桥接物理网络? docker默认提供了一个隔离的内网环境,启动时会建立一个docker0的虚拟网卡,每个容器都是连接到docker0网卡上的.而docker0的ip段为172.1 ...

  5. 0基础学python3心得体会 - python3学习笔记 - python3基础

    基础预热 print()会依次打印每个字符串,遇到逗号","会输出一个空格,可以打印整数,或者计算 结果 Python提供了一个input(),,可以让用户输入字符串,并存放到一个 ...

  6. ucore文件系统详解

    最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...

  7. 针对Student表的DAO设计实例

    完整代码以及junit,mysql--connector包下载地址 : https://github.com/CasterWx/MyStudentDao 表信息: 代码: dao包----impl包- ...

  8. SpringMvc Json LocalDateTime 互转,form urlencoded @ModelAttribute 转换

    JDK8 的LocalDate 系列日期API ,比Date 或者 Calendar 都好用很多,但是在SpringMvc 自动装配会有点小问题 会导致抛出类似异常 default message [ ...

  9. 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...

  10. java基础之继承(二)

    上篇我们介绍了java中的构造方法,了解了关键字this和super在继承中所起到的作用,this可以显式调用重载的构造方法,super可以显式的调用父类中的任意可见方法.了解方法重载和重写的区别,知 ...