博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3546 Life of the Party (二分图匹配-最大流)
阅读量:7115 次
发布时间:2019-06-28

本文共 1244 字,大约阅读时间需要 4 分钟。

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3546

题意:给定一个二分图。(AB两个集合的点为n,m),边有K个。问去掉哪些点后最大匹配会减少。

思路:首先建图跑最大流。然后从s开始dfs一次,若能跑到B集合中的点x,那么说明x可以匹配A集合中的某点,那么x删掉也无所谓。从t开始dfs一次,类似,到达s中的y,那么y删掉也无所谓。

const int INF=1000000005;const int N=20005;struct node{    int v,next,cap;};        node edges[N*20];int head[N],e;int curedge[N];        inline void add(int u,int v,int cap){    edges[e].v=v;    edges[e].cap=cap;    edges[e].next=head[u];    head[u]=e++;}        inline void Add(int u,int v,i64 cap){    add(u,v,cap);    add(v,u,0);}   int dis[N];      int Q[N];int bfs(int s,int t){    clr(dis,-1);    int i;    for(i=s;i<=t;i++) curedge[i]=head[i];    int L=0,R=0;       dis[s]=0;    Q[R++]=s;       while(L
n) f[u]=1; else f[u]=0; int i; for(i=head[u];i!=-1;i=edges[i].next) { int v=edges[i].v; if(edges[i^c].cap>0&&!visit[v][c]&&v!=SS&&v!=TT) { dfs(v,c); } }}int main(){ n=getInt(); m=getInt(); K=getInt(); clr(head,-1); int s=0,t=n+m+1; int i; for(i=1;i<=n;i++) Add(s,i,1); for(i=1;i<=m;i++) Add(i+n,t,1); for(i=1;i<=K;i++) { int x=getInt(); int y=getInt(); Add(x,y+n,1); } dinic(s,t); SS=s; TT=t; dfs(s,0); dfs(t,1); for(i=1;i<=n;i++) if(!f[i]) printf("%d\n",i); for(i=1;i<=m;i++) if(!f[i+n]) printf("%d\n",i); }

 

转载地址:http://szwel.baihongyu.com/

你可能感兴趣的文章
神经网络练习四-ex4
查看>>
通用for_each清理容器模板函数
查看>>
MVC5发布到IIS,出现HTTP 错误 404.0 - Not Found的完美解决方法
查看>>
c# 与 java 语法异同
查看>>
cleanup failed because the file not under version control问题的解决
查看>>
html+css+js实现滑动导航条(转载)
查看>>
BZOJ 2039人员雇佣
查看>>
angular ng-repeat出来的数据 每条修改数据后返回给接口 如何取到每个对应修改的值...
查看>>
nodeJs express mongodb 建站(linux 版)
查看>>
java使用websocket,并且获取HttpSession,源码分析
查看>>
odoo开发笔记 -- 视图继承扩展
查看>>
图书管理系统——面向对象程序设计
查看>>
ASP.NET发送电子邮件
查看>>
LINQ学习(三):Where子句
查看>>
Hadoop之Hive 安装_在hadoop 伪分布上
查看>>
hadoop 之 kafka 安装与 flume -> kafka 整合
查看>>
mysql
查看>>
python日志输出
查看>>
Dynamics CRM 开启EmailRouter日志记录
查看>>
CF219B:Special Offer! Super Price 999 Bourles!(贪心)
查看>>