题目链接: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<R)
    {
        int u=Q[L++];

        for(i=head[u];i!=-1;i=edges[i].next)
        {
            if(edges[i].cap&&-1==dis[edges[i].v])
            {
                dis[edges[i].v]=dis[u]+1;
                Q[R++]=edges[i].v;
                if(edges[i].v==t) return 1;
            }
        }
    }
    return 0;
}

int DFS(int u,int det,int t)
{
    if(u==t) return det;
    int now=0;
    int i;
    for(int &i=curedge[u];i!=-1&&det;i=edges[i].next)
    {
        int v=edges[i].v;
        int w=edges[i].cap;
        if(w&&dis[u]+1==dis[v])
        {
            int tmp=DFS(v,min(w,det),t);
            if(tmp==0) continue;
            edges[i].cap-=tmp;
            edges[i^1].cap+=tmp;
            now+=tmp;
            det-=tmp;
        }
    }
    return now;
}

int dinic(int s,int t)
{
    int ans=0;
    while(bfs(s,t)) ans+=DFS(s,INF,t);
    return ans;
}

int n,m,K;

int visit[N][2];
int f[N];

int SS,TT;

void dfs(int u,int c)
{
	visit[u][c]=1;
	if(c==0&&u<=n||c==1&&u>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);
}

BZOJ 3546 Life of the Party (二分图匹配-最大流)的更多相关文章

  1. BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以 ...

  2. BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】

    题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...

  3. bzoj 1191 [ HNOI 2006 ] 超级英雄Hero —— 二分图匹配

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 就是二分图匹配的裸题: 注意题目要求是第一次匹配失败就退出!没仔细看题差点丢失1A. ...

  4. BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6263  Solved: 2799[Submit][ ...

  5. BZOJ 1143 [CTSC2008]祭祀river(二分图匹配)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1143 [题目大意] 给出一张有向图,问最大不连通点集,连通具有传递性 [题解] 我们将 ...

  6. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  7. 最短路&生成树&二分图匹配&费用流问题

    最短路 题意理解,建图 https://vjudge.net/problem/UVALive-4128 飞机票+行程建图 https://vjudge.net/problem/UVALive-3561 ...

  8. HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ...

随机推荐

  1. 夺命雷公狗—angularjs—8—ng-class的简单用法

    我们在正常的业务处理中往往会遇到一些逻辑类的问题,比如各行换色,现在angularjs里面也给我们提供了一个小小的的class处理的方式,废话不多说,如下所示: <!doctype html&g ...

  2. batch批的概念

    批处理(Batch Requests), 批处理简单理解为同时执行的一批SQL处理语句,一个批处理中可能有多个DML.多个存储过程等等.如在SSMS操作,每个'GO'执行前都属于一个批处理. 注意区分 ...

  3. HGE游戏引擎之hgeQuad结构体的使用(用于渲染图片)

    HGE基本的渲染图元是hgeQuad (Quad is the basic HGE graphic primitive),其中有一个hgeVertex成员结构,它用来描述图元顶点信息.The hgeV ...

  4. android 学习随笔十八(广播与服务 )

    1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...

  5. :eq(index)

    匹配一个给定索引值的元素 从 0 开始计数 查找第二行 HTML 代码: <table> <tr><td>Header 1</td></tr> ...

  6. laravel5.1启动详解

    laravel的启动过程 如果没有使用过类似Yii之类的框架,直接去看laravel,会有点一脸迷糊的感觉,起码我是这样的.laravel的启动过程,也是laravel的核心,对这个过程有一个了解,有 ...

  7. Hibernate,JPA注解@OneToMany_Map

    用例代码如下: 数据库DDL语句 1,CAT表 create table CAT ( id VARCHAR2(32 CHAR) not null, create_time TIMESTAMP(6), ...

  8. JavaEE基础(二十五)/多线程、GUI

    1.多线程(单例设计模式) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类中定义一个本类的 ...

  9. 三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA)

    转载http://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html 做三次样条曲线时,需要解三对角矩阵(Tridiagonal Mat ...

  10. 天大acm 题号1002 Maya Calendar

    Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现.从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法.这 个Haab历 ...