分析

先讲一下连边方法:

\(S\)向意愿同意的人,意愿反对的人向\(T\),朋友之间互相连(其实好像意愿不同的朋友之间互相连就可以了,嘛,不管了),容量均为\(1\)。

最小割即为答案。

可以理解为,一个人要么背叛自己的意愿,要么背叛自己的友情,背叛可以理解为割掉对应的边。(QwQ)

在做这种“每个对象有两种或更多种决策,且一个对象的决策会影响到其他对象,想要达到全局最优”类似的题目时,可以考虑一下转化为最小割模型,不要执着于DP和贪心。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL; inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
} const int MAXN=305;
const int MAXM=45605;
int n,m,S,T,maxflow,mincut;
int ecnt=1,head[MAXN];
int dep[MAXN],cur[MAXN];
std::queue<int> q;
struct Edge{
int to,nxt,cap;
}e[MAXM<<1]; inline void add_edge(int bg,int ed,int ca){
ecnt++;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
e[ecnt].cap=ca;
head[bg]=ecnt;
} inline bool bfs(){
memset(dep,0,sizeof dep);
rin(i,1,T) cur[i]=head[i];
while(!q.empty()) q.pop();
q.push(S);
dep[S]=1;
while(!q.empty()){
int x=q.front();
q.pop();
trav(i,x){
int ver=e[i].to;
if(dep[ver]||!e[i].cap) continue;
dep[ver]=dep[x]+1;
q.push(ver);
}
}
return dep[T]>0;
} int dfs(int x,int pref){
if(x==T||!pref) return pref;
int flow=0,temp;
for(int &i=cur[x];i;i=e[i].nxt){
int ver=e[i].to;
if(dep[ver]==dep[x]+1&&(temp=dfs(ver,std::min(e[i].cap,pref)))){
e[i].cap-=temp;
e[i^1].cap+=temp;
flow+=temp;
pref-=temp;
if(!pref) return flow;
}
}
return flow;
} inline void dinic(){
while(bfs()) maxflow+=dfs(S,1e9);
} int main(){
n=read(),m=read();
S=n+1,T=S+1;
rin(i,1,n){
int typ=read();
if(typ) add_edge(S,i,1),add_edge(i,S,0);
else add_edge(i,T,1),add_edge(T,i,0);
}
rin(i,1,m){
int u=read(),v=read();
add_edge(u,v,1);
add_edge(v,u,1);
}
dinic();
mincut=maxflow;
printf("%d\n",mincut);
return 0;
}

最新文章

  1. Windows 2008 - 由于管理员设置的策略,该磁盘处于脱机状态
  2. 机器学习实战笔记--k近邻算法
  3. C语言中,while()语句中使用赋值语句
  4. Codeforces Round #FF/#255 D DZY Loves Modification --贪心+优先队列
  5. 解决:Angular-cli:执行ng-build --prod后,dist文件里无js文件、文件未压缩等问题
  6. 【C语言】08-数组
  7. Linux邮件服务器架构
  8. 19款绚丽实用的jQuery/CSS3侧边栏菜单
  9. Qt postEvent
  10. 【开源推荐】AllJoyn:打造全球物联网的通用开源框架
  11. live555从RTSP服务器读取数据到使用接收到的数据流程分析
  12. 用4bit的counter看同步复位与异步复位
  13. Wannafly模拟赛5 A Split 暴力 二分加速
  14. 我了解到的新知识之----遇到路由器DNS被篡改我该怎么办?
  15. Spring学习札记(一)
  16. 【代码笔记】Web-JavaScript-javaScript for循环
  17. try 和 catch 和 finally
  18. Learning-Python【11】:函数嵌套及作用域
  19. 在 Laravel 5 中集成七牛云存储实现云存储功能(非上传)
  20. 史上最全的Angular.js 的学习资源

热门文章

  1. xmake从入门到精通10:多个子工程目标的依赖配置
  2. 第四周Java作业及总结
  3. [转帖]linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令
  4. Oracle Replace函数的简单使用
  5. Codeforces - 1202D - Print a 1337-string... - 构造
  6. AFNetworking2.0源码解析&lt;三&gt;
  7. CentOS7编译安装MySQL8.0
  8. PAT Basic 1032 挖掘机技术哪家强 (20 分)
  9. GUI学习之二十三——QComboBox学习总结
  10. 洛谷 P4665 [BalticOI 2015]Network