【BZOJ 1934】 [Shoi2007]Vote 善意的投票
1934: [Shoi2007]Vote 善意的投票
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1205 Solved: 746
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 0 0
1 2
1 3
3 2
Sample Output
HINT
在第一个例子中,所有小朋友都投赞成票就能得到最优解
Source
Day2
最小割。
如果x属于s集表示赞同,否则不赞同。
因此如果原本赞同,那么s到x连流量为1的边,x到t连流量为0的边:
表示如果让他不赞同,要产生1的代价。
朋友意见不同要产生1的代价,那么在图中表示为如果两个人属于不同集合要产生1的代价,那么x->y,y->x分别连流量为1的边。
答案就是最小割。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#define M 300+5
#define inf 0x3f3f3f3f
using namespace std;
queue<int> q;
int n,m,tot=1,h[M],cur[M],v[M],d[M],s,t;
struct edge
{int from,to,cap,flow,ne;
}E[200005];
void Addedge(int from,int to,int cap)
{E[++tot]=(edge){from,to,cap,0,h[from]};h[from]=tot;E[++tot]=(edge){to,from,0,0,h[to]};h[to]=tot;
}
bool bfs()
{for (int i=s;i<=t;i++)v[i]=0;d[s]=0,q.push(s);while (!q.empty()){int x=q.front();q.pop();for (int i=h[x];i;i=E[i].ne){edge e=E[i];if (!v[e.to]&&e.cap>e.flow){d[e.to]=d[x]+1;v[e.to]=1;q.push(e.to);}}}return v[t];
}
int dfs(int x,int a)
{if (x==t||!a) return a;int flow=0;for (int &i=cur[x];i;i=E[i].ne){edge &e=E[i];if (d[e.to]!=d[x]+1) continue;int f=dfs(e.to,min(a,e.cap-e.flow));if (f){e.flow+=f;E[i^1].flow-=f;flow+=f;a-=f;if (!a) break;}}return flow;
}
int dinic()
{int flow=0;while (bfs()){for (int i=s;i<=t;i++)cur[i]=h[i];flow+=dfs(s,inf);}return flow;
}
int main()
{scanf("%d%d",&n,&m);s=0,t=n+1;for (int i=1;i<=n;i++){int x;scanf("%d",&x);Addedge(s,i,x);Addedge(i,t,x^1);}for (int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);Addedge(x,y,1);Addedge(y,x,1);}cout<<dinic()<<endl;return 0;
}
感悟:
两个点属于不同集合要产生代价时,他们直接连上两条边
【BZOJ 1934】 [Shoi2007]Vote 善意的投票相关推荐
- bzoj 1934: [Shoi2007]Vote 善意的投票(最小割)
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1796 Solved: 1094 [Submit ...
- ●BZOJ 1934 [Shoi2007]Vote 善意的投票
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1934 题解: 题目有点迷. S向为1的点连边,为0的点向T连边, 在有关系的两个点之间连双向 ...
- BZOJ 1934: [Shoi2007]Vote 善意的投票
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1934 求图的最小割=求一下图的最大流. #include <iostream> ...
- 1934: [Shoi2007]Vote 善意的投票
Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可 ...
- 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割
[BZOJ2768][JLOI2010]冠军调查 Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教 ...
- [bzoj1934][Shoi2007]Vote 善意的投票
来自FallDream的博客,未经允许,请勿转载,谢谢. 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为 ...
- bzoj1934: [Shoi2007]Vote 善意的投票(最小割)
传送门 考虑源点为同意,汇点为反对,那么只要源点向同意的连边,不同意的向汇点连边,求个最小割就是答案 然后考虑朋友之间怎么办,我们令朋友之间连双向边.这样不管怎么割都能对应一种选择情况.那么还是求一个 ...
- bzoj1934 [Shoi2007]Vote 善意的投票 最小割
一上来容易想到缩点dp,但由于一个集合是没法用状态表示的,所以不能dp 然后就可以想到最小割,即通过割边和代价完成分配: 就比较好做了,默认选0就和0连边,默认选1就和1连边,朋友之间连边,如果在同一 ...
- [BZOJ1934][Shoi2007]Vote 善意的投票[最小割]
建图方式: S->同意 ,反对->T 对于每一对好友连容量为1的边 #include <bits/stdc++.h> using namespace std; const in ...
最新文章
- mini2440 SD卡烧写系统
- python3.7安装numpy模块-Python3.7模块numpy
- redis 永不过期 java_死磕 Java
- vim显示行号、语法高亮、自动缩进的设置
- mysql在表的某一位置增加一列、删除一列、修改列名
- 浅谈电商网站开发中用户会话管理机制的设计和实现原理
- 美国“四院院士”特伦斯谈人工智能“瓶颈”:远未达极限,数学家已经有了实现AI可解释性的理论工具...
- Redis哈希数详解
- PREEMPT_RT 3.18.136 实时时延评估
- flutter优缺点_混合开发框架最全对比,为什么我更推荐Flutter?
- PLC编程系统的使用经验分享
- Chrome(谷歌浏览器)插件资料 !
- 安装算量软件使用_鹏业安装算量软件常用按钮汇总(三)
- java浏览 下单界面_Javaweb网上商城项目实战(24)实现订单详情查询功能
- 转载——visio密钥
- [剑指-Offer] 0. 《剑指-Offer》面试题题解汇总
- Python函数和面向对象,小白看了都说好
- 动态规划DP的概念与总结
- MinGW 环境变量的配置
- 迷幻的find函数用法
热门文章
- Qt获取本机IP、MAC地址、子网掩码、网卡名等函数设计
- 毫无表情的扑克脸——德扑10大基本攻守策略
- 什么样的程序猿适合去创业公司
- 函数式编程|python的函数式编程
- ArcGIS制图技巧:制图入门与点、线、面状符号制作
- 怎样搭建游戏服务器,传奇复古版手游是怎样搭建的,用云服务器架设游戏技术详细教程
- RecyclerView EditText 数据错乱问题
- MySQL InnoDB 表不存在问题修复
- 【ES】ES搜索结果中各个字段介绍,hits,took,timeout
- K8s9(2-1) k8s中的通信机制, kube-proxy的ipvs模式 ,无头服务,LoadBalancer,ExternalName,外部公有 ip(externalIPs)