Time Limit: 1000ms      Memory Limit: 128MB

Description

最小点覆盖是指在二分图中,用最小的点集覆盖所有的边。当然,一个二分图的最小点覆盖可能有很多种。

现在给定一个二分图,请你把图中的点分成三个集合:

如果在任何一种最小点覆盖中都不包含这个点,则认为该点属于N集合。

如果在任何一种最小点覆盖中都包含这个点,则认为该点属于A集合。

如果一个点既不属于N集合,又不属于A集合,则认为该点属于E集合。

Input

第一行包含三个整数n, m, k,分别表示二分图A侧点的数量,二分图B侧点的数量,边的数量。

接下来k行,每行两个整数i, j,分别表示二分图A侧第i号点与二分图B侧第j号点有连边。

数据保证无重边。

Output

第一行输出一个长度为n的字符串,其中第i个字符表示二分图A侧第i个点所属的集合。

第二行输出一个长度为m的字符串,其中第i个字符表示二分图B侧第i个点所属的集合。

Sample Input

11 9 22

1 1

1 2

1 3

1 8

1 9

2 1

2 3

3 2

3 4

4 3

4 5

5 2

5 4

5 6

6 6

6 7

7 5

7 7

8 7

9 7

10 7

11 7

Sample Output

AEEEEEENNNN

EEEEEEANN

HINT

对于10%的数据,$1≤n,m≤5$

对于40%的数据,$1≤n,m≤100$

对于100%的数据,$1≤n,m≤1000, 0≤k≤n∗m$

[吐槽]

  场上?嗯。。大眼瞪小眼qwq

[题解]

  嗯首先码一下最小点覆盖的相关知识

  König定理

  一个二分图中最大的匹配数=该图中最小点覆盖数

  (写得比较长所以就拎出来啦不然对不起自己就是这样哈哈)

  http://www.cnblogs.com/yoyoball/p/7632871.html

  从链接回到这道题

  铺垫什么的。。好像略微有点多不过。。

  嗯不管了

  然后我们就可以得出一个结论:

  如果一个点没有任何一条匹配边连到,那么这个点肯定不在最小点覆盖中

  从而与它相连的点必定要在最小点覆盖中(不然这两点之间的连边就不能覆盖到了)

  而对于一个必定在最小点覆盖中的点,与它的匹配点必定不在最小点覆盖中

  然后就这样顺着遍历同时标记就好啦

  对于那些没有被标记到的点,肯定就是属于E的啦

  好的于是在漫长的铺垫之后这题终于解决啦ovo

  (果然把最小点覆盖的东西拎出来之后清爽了很多哈哈哈)

[一些细节]

  首先。。要用long long

  其次。。注意边数

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=*;
struct xxx
{
int y,next;
}a[**];
char mark[MAXN];
bool vis[MAXN];
int h[MAXN],match[MAXN];
int n,m,tot,k,ans;
int add(int x,int y);
bool dfs(int x);
int solve();
int work(int x,int op); int main()
{
// freopen("a.in","r",stdin); int x,y;
scanf("%d%d%d",&n,&m,&k);
memset(h,-,sizeof(h));
tot=;
for (int i=;i<=k;++i)
{
scanf("%d%d",&x,&y);
add(x,n+y); add(n+y,x);
}
memset(match,,sizeof(match));
for (int i=;i<=n+m;++i) mark[i]='E';
for (int i=;i<=n;++i)
if (!match[i])
{
memset(vis,false,sizeof(vis));
if (dfs(i)) ++ans;
}
// for (int i=1;i<=n;++i) printf("%d ",match[i]-n);
solve();
for (int i=;i<=n;++i) printf("%c",mark[i]);
printf("\n");
for (int i=n+;i<=n+m;++i) printf("%c",mark[i]);
} int add(int x,int y)
{
a[++tot].y=y; a[tot].next=h[x]; h[x]=tot;
} bool dfs(int x)
{
int u;
for (int i=h[x];i!=-;i=a[i].next)
{
u=a[i].y;
if (vis[u]) continue;
vis[u]=true;
if (!match[u]||dfs(match[u]))
{
match[x]=u;
match[u]=x;
return true;
}
}
return false;
} int solve()
{
for (int i=;i<=n+m;++i)
{
if (!match[i])
mark[i]='N',work(i,);
}
} int work(int x,int op)
{
int u;
if (op==)
{
mark[x]='A';
work(match[x],);
return ;
}
mark[x]='N';
for (int i=h[x];i!=-;i=a[i].next)
{
u=a[i].y;
if (mark[u]=='E') work(u,);
}
}

挫挫滴代码

【noip模拟】最小点覆盖的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  6. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  7. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  8. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  9. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

随机推荐

  1. PHP读取大文本文件并处理数据的思路

    //处理文件 $file = fopen($filename, "r") or exit("Unable to open file!"); $total_lin ...

  2. 设为首页/加入收藏JS代码

    传统网站常用的设为首页/加入收藏js代码 <a href="javascript:void(0)" onclick="sethome(this,window.loc ...

  3. JQuery坑,说说哪些大家都踩过的坑

    1 乱用选择器 坑人指数:200 JQuery选择器调用代价很大,反复调用效率更低.应采用缓存对象的方法或采用链式调用的方式. //错误的写法 $("#button").click ...

  4. 分享:Python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...

  5. 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)

    本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...

  6. 剑指offer第八天

    32.把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323 ...

  7. UVA - 11270 轮廓线DP

    其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411 贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^ ...

  8. 求第k小的数 O(n)复杂度

    思路:利用快速排序的思想,把数组递归划分成两部分.设划分为x,数组左边是小于等于x,右边大于x.关键在于寻找一个最优的划分,经过 Blum . Floyd . Pratt . Rivest . Tar ...

  9. 算法提高 金属采集 树形DP

    题目链接:金属采集 思路:d(i, j)表示在以i为根结点的子树中使用j个机器人的最小花费.设v为u的一个子节点,从节点i使用k个机器人收集以v为根结点的能量,状态转移方程为d(u, i) = min ...

  10. HashMap/HashSet,hashCode,哈希表

    hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...