s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1。跑最大流的结果即为答案。
考虑这样做的意义。最小割就是把总点集分割为两个点集S,T,使得所有\(u\in S,v\in T,val(u,v) \)的值最小。也就是说,在这道题中的意义就是使最少的边两端相异(s代表选1,t代表选0,所以违背自己就是割掉与s或者t的边)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=505,M=200005,inf=1e9;
int n,m,s,t,le[N],h[N],cnt;
struct qwe
{int ne,to,v;
}e[M];
int read()
{int r=0,f=1;char p=getchar();while(p>'9'||p<'0'){if(p=='-')f=-1;p=getchar();}while(p>='0'&&p<='9'){r=r*10+p-48;p=getchar();}return r*f;
}
void add(int u,int v,int w)
{cnt++;e[cnt].ne=h[u];e[cnt].to=v;e[cnt].v=w;h[u]=cnt;
}
void ins(int u,int v,int w)
{//cout<<u<<" "<<v<<endl;add(u,v,w);add(v,u,0);
}
bool bfs()
{memset(le,0,sizeof(le));queue<int>q;le[s]=1;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=h[u];i;i=e[i].ne)if(!le[e[i].to]&&e[i].v>0){le[e[i].to]=le[u]+1;q.push(e[i].to);}}return le[t];
}
int dfs(int u,int f)
{if(u==t||!f)return f;int us=0;for(int i=h[u];i&&us<f;i=e[i].ne)if(le[e[i].to]==le[u]+1&&e[i].v>0){int t=dfs(e[i].to,min(e[i].v,f-us));e[i].v-=t;e[i^1].v+=t;us+=t;}return us;
}
int dinic()
{int re=0;while(bfs())re+=dfs(s,inf);return re;
}
int main()
{while(1){memset(h,0,sizeof(h));cnt=1;n=read(),m=read();if(!n)break;s=0,t=n+1;for(int i=1;i<=n;i++){int x=read();if(x)ins(s,i,1);elseins(i,t,1);}for(int i=1;i<=m;i++){int x=read(),y=read();add(x,y,1);add(y,x,1);}printf("%d\n",dinic());}return 0;
}

转载于:https://www.cnblogs.com/lokiii/p/8403487.html

spoj 1693 COCONUTS - Coconuts【最小割】相关推荐

  1. HDU3138 Coconuts(最小割)

    题目大概说有n个人每个人各有一个信仰0或1,他们中有m对朋友关系,现在要对一件事投票,可以为了和信仰不同的朋友一样而违背自己的信仰和朋友投一样的票,问违背信仰的人数加上和朋友投票结果不同的人数总和的最 ...

  2. SPOJ 1693 Coconuts

    SPOJ_1693 COCONUTS 对于每个人的选择一共有两种,根据他们最后的选择就可以将这些人分成两个集合,显然集合间如果有朋友形成的边的话是要删掉的,这样实际上就形成了一个割,对应的持不同意见的 ...

  3. bzoj 2400: Spoj 839 Optimal Marks(最小割)

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 873  Solved: 330 [Subm ...

  4. SPOJ - OPTM Optimal Marks(进制拆分+最小割)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的图,有 k 个点初始时就有权值 w[ i ],现在问如何给剩下的节点赋值,使得整张图的总权值和最小,每条边的权值为:w( u , v ...

  5. Optimal Marks SPOJ - OPTM(最小割)

    传送门 论文<最小割模型在信息学竞赛中的应用>原题 二进制不同位上互不影响,那么就按位跑网络流 每一位上,确定的点值为1的与S连一条容量为INF的有向边.为0的与T连一条容量为INF的有向 ...

  6. 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 567  Solved: 202 [Subm ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  9. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

最新文章

  1. 2022-2028年中国橡胶密封制品行业市场研究及前瞻分析报告
  2. xp与Vista双系统 相关问题
  3. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)
  4. Provisioning Services 7.6 入门到精通系列之七:创建虚拟磁盘
  5. 华为OV小米鸿蒙,华为鸿蒙开源,小米OV们会采用吗?
  6. mysql独有的函数_数据库之MySQL函数(一)
  7. svn添加到windows服务中
  8. EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案
  9. postgresql开启历史查询记录日志
  10. 常用的电子产品安规基础标准 - IEC Standards(CB转换或各国安规标准)
  11. 《机器学习实战:基于Scikit--Learn、Keras和TensorFlow(第2版)》学习笔记——前言
  12. 行人跟踪之身份识别(一)
  13. 用Navicat Premium连接数据库!
  14. JavaWeb开发了解
  15. 互联网(internet)、因特网(Internet)、万维网(World Wide Web)三者区别
  16. Ant Design蚂蚁设计理念
  17. WiFi - 为啥WiFi信号的总是这么差?【附:解决方案】
  18. 正则表达式判断合法的电话号码
  19. Java -- 银行家算法
  20. 话说产品方法论——需求与用户研究

热门文章

  1. Linux一键安装包安装禅道
  2. 都2020年了,翟天临对毕业生论文查重的影响还剩多少?
  3. 明天准备离职了,面对照顾自己的领导,要这样说
  4. 零基础一个月学会这些就能成为初级CSS前端开发工程师
  5. android 5.1 白名单,iqoo5如何将应用加密 iqoo5一键设置应用白名单方法分享
  6. windows server2016错误0xc004f07422原因之一
  7. java 模型驱动_(九)Struts2模型驱动和属性驱动
  8. 读者调研 | 行上行下小书屋邀你填问卷啦
  9. android videoview 隐藏 播放按钮
  10. Bulk Insert:将文本数据(csv和txt)导入到数据库中