bzoj 1934: [Shoi2007]Vote 善意的投票(最小割)
1934: [Shoi2007]Vote 善意的投票
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1796 Solved: 1094
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 0 0
1 2
1 3
3 2
Sample Output
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 善意的投票(最小割)相关推荐
- 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割
[BZOJ2768][JLOI2010]冠军调查 Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教 ...
- ●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> ...
- bzoj1934 [Shoi2007]Vote 善意的投票 最小割
一上来容易想到缩点dp,但由于一个集合是没法用状态表示的,所以不能dp 然后就可以想到最小割,即通过割边和代价完成分配: 就比较好做了,默认选0就和0连边,默认选1就和1连边,朋友之间连边,如果在同一 ...
- [BZOJ1934][Shoi2007]Vote 善意的投票[最小割]
建图方式: S->同意 ,反对->T 对于每一对好友连容量为1的边 #include <bits/stdc++.h> using namespace std; const in ...
- 1934: [Shoi2007]Vote 善意的投票
Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可 ...
- 【BZOJ 1934】 [Shoi2007]Vote 善意的投票
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1205 Solved: 746 [Submit] ...
- bzoj1934: [Shoi2007]Vote 善意的投票(最小割)
传送门 考虑源点为同意,汇点为反对,那么只要源点向同意的连边,不同意的向汇点连边,求个最小割就是答案 然后考虑朋友之间怎么办,我们令朋友之间连双向边.这样不管怎么割都能对应一种选择情况.那么还是求一个 ...
- P2057 [SHOI2007]善意的投票 最小割
题意大致就是有n个人有两种不同的意见并且有许多朋友,需要让朋友间尽可能的统一意见(少发生冲突),如果一个人违反自己的本意也算冲突,求最少的冲突... 很明显是最小割 跑最大流算出冲突数 两种意见可 ...
最新文章
- Spring官网改版后下载方式
- python—web页面操作之3种等待方式
- postgresql介绍,安装,启动
- vue路由守卫判断用户是否登录,如果没登陆就跳转到登录
- OSPF地址汇总配置
- 黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾
- 自定义View(未完待续)
- 32岁了学python来的及吗_现在27岁学python来得及吗?
- hyperterminal使用教程_如何在Win中安装使用超级终端HyperTerminal.doc
- 无法找到mac地址必须重启计算机_AB PLC | CPU或以太网模块重启DHCP请求
- 解决办法:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
- 图像任意角度旋转和翻转(C#)
- Python爬虫理论 | (2) 网络请求与响应
- ADSL 拨号代理的搭建
- html文本转成二进制,肿么把文本文件转换成二进制bin文件
- 嵌入式计算机系统简述,嵌入式系统简述
- Python网络爬虫基础
- Metasploit 【入门】
- 职业教育转型线上,机构要如何通过直播来引流获客?
- 提升线下零售企业的市场竞争力--数据分析