[BZOJ 2768] 冠军调查
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2768
Solution:
一道比较基础的最大流的题目
一般看到将点分为两类的题目就要往网络流方向想吧
建图:
源点向每个初始立场为1的人连权值为1的边。
每个初始立场为0的人向汇点连权值为1的边。
好朋友之间互相连权值为1的边。
最小割即是答案。
要满足要求且总和最小,就不能让任何一对(1,0)关系成立,这便对应着最小割模型
割与源/汇点的边对应“说谎”,割二分图内部的边对应“立场不同”
Code:
//by NewErA
#include <bits/stdc++.h> using namespace std;
#define FF first
#define SS second
#define PB push_back
#define MP make_pair
#define bged(v) (v).begin(),(v).end()
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)
typedef long long ll;
typedef pair<int,int> P;
typedef pair<pair<int,int>,int> PP;
const int INF=<<;
const int MOD=1e9+;
//My IO system
struct fastio
{
char s[];
int it,len;
fastio(){it=len=;}
inline char get()
{
if(it<len)return s[it++];it=;
len=fread(s,,,stdin);
if(len==)return EOF;else return s[it++];
}
bool notend()
{
char c=get();
while(c==' '||c=='\n')c=get();
if(it>)it--;
return c!=EOF;
}
}_buff;
#define Read1(x) x=getnum()
#define Read2(x,y) Read1(x),Read1(y)
#define Read3(x,y,z) Read2(x,y),Read1(z)
#define Write1(x) putnum(x),putchar('\n')
#define Write2(x,y) Write1(x),Write1(y)
#define Write3(x,y,z) Write2(x,y),Write1(z)
inline ll getnum()
{
ll r=;bool ng=;char c;c=_buff.get();
while(c!='-'&&(c<''||c>''))c=_buff.get();
if(c=='-')ng=,c=_buff.get();
while(c>=''&&c<='')r=r*+c-'',c=_buff.get();
return ng?-r:r;
}
template<class T> inline void putnum(T x)
{
if(x<)putchar('-'),x=-x;
register short a[]={},sz=;
while(x)a[sz++]=x%,x/=;
if(sz==)putchar('');
for(int i=sz-;i>=;i--)putchar(''+a[i]);
} const int MAXN=;
int n,m,s,t,level[MAXN],iter[MAXN],dat[MAXN]; struct edge
{
int to,cap,rev;
};
vector<edge> a[MAXN]; void add_edge(int to,int from,int cap)
{
a[to].push_back(edge{from,cap,a[from].size()});
a[from].push_back(edge{to,cap,a[to].size()-});
} void bfs()
{
memset(level,-,sizeof(level));
queue<int> Q;Q.push(s);level[s]=;
while(!Q.empty())
{
int cur=Q.front();Q.pop();
for(int i=;i<a[cur].size();i++)
{
edge e=a[cur][i];
if(e.cap && level[e.to]==-)
{
level[e.to]=level[cur]+;
Q.push(e.to);
}
}
}
} int dfs(int v,int f)
{
if(v==t) return f;
int ret=;
for(int &i=iter[v];i<a[v].size();i++)
{
edge &e=a[v][i];
if(level[e.to]==level[v]+ && e.cap)
{
int d=dfs(e.to,min(f,e.cap));
f-=d;ret+=d;
e.cap-=d;a[e.to][e.rev].cap+=d;
if(!f) break;
}
}
return ret;
} int main()
{
Read2(n,m);s=n+,t=s+;
for(int i=;i<=n;i++)
{
Read1(dat[i]);
if(dat[i]) add_edge(i,t,);
else add_edge(s,i,);
}
for(int i=;i<=m;i++)
{
int x,y;Read2(x,y);
if(dat[x]!=dat[y]) add_edge(x,y,);
} ll res=;
while(true)
{
memset(iter,,sizeof(iter));
bfs();int f=;
if(level[t]<) break;
res+=dfs(s,INF);
}
cout << res;
return ;
}
Review:
很多时候碰到这样类似的二元关系就要往网络流方向想
割的边容量即为计入答案的数值
[BZOJ 2768] 冠军调查的更多相关文章
- BZOJ 2768 冠军调查(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2768 题意:给出一个无向图,每个点有一个值0或者1.现在重新设置每个点的值0或者1.设重 ...
- BZOJ 2768: [JLOI2010]冠军调查 最小割
2768: [JLOI2010]冠军调查 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2768 Description 一年一度的欧洲足 ...
- 【BZOJ】【2768】【JLOI2010】冠军调查
网络流/最小割 我不会告诉你这题跟 BZOJ 1934 是一模一样的……包括数据范围…… /****************************************************** ...
- 2768: [JLOI2010]冠军调查( 最小割 )
最小割... 怎么乱搞都可以 -------------------------------------------------------------------------------- #inc ...
- [bzoj 2768]&[bzoj 1877]
传送门1 传送门1 Solution 两道比较裸的题... 复习一下最大流和费用流的模板. Code[bzoj 2768][JLOI 2010] 冠军调查 #include<bits/stdc+ ...
- 【BZOJ-2768】冠军调查 最小割
2768: [JLOI2010]冠军调查 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 971 Solved: 661[Submit][Status ...
- BZOJ2768: [JLOI2010]冠军调查
2768: [JLOI2010]冠军调查 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 484 Solved: 332[Submit][Status ...
- BZOJ-2768: [JLOI2010]冠军调查(超级裸的最小割)
2768: [JLOI2010]冠军调查 Time Limit: 10 Sec Memory Limit: 128 MB Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着 ...
- 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割
[BZOJ2768][JLOI2010]冠军调查 Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教 ...
随机推荐
- jQuery.getJSON跨域访问的正确使用方式(史上最傻瓜式解释)
最近花了2天时间完整的看了一遍 jQuery 的API,其中 $.getJSON(url[, data][, callback]) 方法的跨域访问解释真心看的一头雾水,大家可以从这里感受一下: htt ...
- 安卓下拉刷新空间SwipeRefreshLayout的基本使用
1.先写布局文件 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" androi ...
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 状压DP初识~~炮兵阵地
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31718 Accepted: 12253 Descriptio ...
- angular js module 的理解
module其实就是一个容器,里面可以装controller,service,directive,filter等, 官网的解释是:Module :A container for the differe ...
- 两数之和 [ leetcode ]
原题地址:https://leetcode-cn.com/articles/two-sum/ 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元 ...
- BootStrap弹出框插件popover简单实例
1.网上实例地址 http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html 2.具体demo $("#pieId&q ...
- objc_msgSend arm64 崩溃问题
http://blog.csdn.net/chenyong05314/article/details/42121001 2014-12-24 10:49 878人阅读 评论(0) 收藏 举报 转载自: ...
- 【bzoj3289】mato的文件管理
首先允许离线,一眼莫队…… 然后考虑对于每次移动,这不就是让你求逆序对嘛(QAQ) 考虑怎么移动? 每次在最后添加一个数,比这个数大的数都会与其形成一个逆序对 每次在最后移除一个数,比这个数大的数都会 ...
- selenium+python自动化82-只截某个元素的图【转载】
前言 selenium截取全图小伙伴们都知道,曾经去面试的时候,面试官问:如何截图某个元素的图?不要全部的,只要某个元素...小编一下子傻眼了,苦心人,天不负,终于找到解决办法了. selenium截 ...