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] 冠军调查的更多相关文章

  1. BZOJ 2768 冠军调查(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2768 题意:给出一个无向图,每个点有一个值0或者1.现在重新设置每个点的值0或者1.设重 ...

  2. BZOJ 2768: [JLOI2010]冠军调查 最小割

    2768: [JLOI2010]冠军调查 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2768 Description 一年一度的欧洲足 ...

  3. 【BZOJ】【2768】【JLOI2010】冠军调查

    网络流/最小割 我不会告诉你这题跟 BZOJ 1934 是一模一样的……包括数据范围…… /****************************************************** ...

  4. 2768: [JLOI2010]冠军调查( 最小割 )

    最小割... 怎么乱搞都可以 -------------------------------------------------------------------------------- #inc ...

  5. [bzoj 2768]&[bzoj 1877]

    传送门1 传送门1 Solution 两道比较裸的题... 复习一下最大流和费用流的模板. Code[bzoj 2768][JLOI 2010] 冠军调查 #include<bits/stdc+ ...

  6. 【BZOJ-2768】冠军调查 最小割

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 971  Solved: 661[Submit][Status ...

  7. BZOJ2768: [JLOI2010]冠军调查

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 332[Submit][Status ...

  8. BZOJ-2768: [JLOI2010]冠军调查(超级裸的最小割)

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MB Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着 ...

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

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

随机推荐

  1. 【NOIP模拟赛】天神下凡 动态开点线段树

    这些圆一定是在同一水平面上的,由于他们没有相交,因此我们发现他们每个人与外界关系可以分为,1.存在并圈圈 2.存在圈圈并被割,因此我们把所有的圆都加1,把被割的在加1,就可以啦,因此我们开一个线段树, ...

  2. MySQL使用笔记(六)条件数据记录查询

    By francis_hao    Dec 17,2016 条件数据记录查询 mysql> select field1,field2-- from table_name where 条件; 其中 ...

  3. Java的外部类为什么不能使用private、protected进行修饰

    对于顶级类(外部类)来说,只有两种修饰符:public和默认(default).因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置.因此,只需要两种控制权限:包控制权限和公开访问权限, ...

  4. Hadoop之计数器与自定义计数器及Combiner的使用

    1,计数器: 显示的计数器中分为四个组,分别为:File Output Format Counters.FileSystemCounters.File Input Format Counters和Ma ...

  5. 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]

    动物园 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物 ...

  6. 51nod 1254 最大子段和 V2 ——单调栈

    N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

  7. 51nod K 汽油补给 大根堆+小根堆....

    题目传送门 用优先队列瞎搞... 想着在每个地方 先算上一个点到这一个点要花费多少钱 这个用小根堆算就好 然后在这个地方加油 把油钱比自己多的替代掉 这个用大根堆维护一下 然后两个堆之间信息要保持互通 ...

  8. angular2框架搭建,angular-cli使用,angular2学习

    angular红红火火很多年了,一眨眼ng4都出来了,我也只能叹息前端的日新月异,以及感叹自己永远追赶不上时代的步伐,但是没关系,一个优秀的前端不在于他懂的无数的框架,而在于遇到问题时候懂得如何学习, ...

  9. camera摄像原理之二:色彩空间【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7912854 对于sensor 来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种( ...

  10. OpenWRT介绍

    1. 介绍 OpenWRT是一款第三方路由器固件, 其特别在于开放性, 如它的文件系统可写, 用户可在路由器上安装需要的第三方软件.通过刷入OpenWRT, 我们可以完成如下事情 - DLNA共享 - ...