【noip模拟】最小点覆盖
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模拟】最小点覆盖的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- 2018.9.22 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
随机推荐
- 💈 A Cross-Thread Call Helper Class
Conmajia © 2012, 2018 Introduction When you are working on background threads and call frontend GUI ...
- mysql2 - 基础
一.SQL 练习 在java1701下,创建Stuednt 表,并插入以下数据: 增加创建时间字段,如下: 更改所有时间为当前时间: 二.数据库基础知识 1. 关系模型 1.1 表 table.列 c ...
- C# winform中Show()和ShowDialog()的区别
项目实际开发中需要根据不同的应用场景利用Show和ShowDialog,尤其是三级弹窗,慎用ShowDialog,否则会导致关闭第三级窗体时,自动关闭第二级,解决方案就是在第一级窗体弹出时采用Show ...
- 使用canvas编写时间轴插件
使用canvas编写时间轴插件 背景 项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击.拖动.放大缩小展示时间轴,获取到时间轴的某个时间.原来的时间轴是 ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记14
day14课程内容: 深浅拷贝 #浅拷贝只能拷贝一层s=[1,'a','b']s1=s.copy()#浅拷贝print(s1)#[1, 'a', 'b']s[0]=2print(s1,s)#[1, ' ...
- Git版本回退和撤销修改的区别
在阅读廖雪峰git教程时,对版本回退和暂存区撤销修改没太看懂,所以自己测试了一下. 版本回退: git reset --hard HEAD 这个命令用于版本回退,就是将已提交的版本覆盖本地工作区的内容 ...
- CodeForces-748C
这题就是确定一个点,然后去找能够实现最短距离的点且距离最远的点,因为题目要求点最少.在查找时,如果从最后的点开始枚举,找到的第一个满足距离最短的点一定是最远点,但是查找的复杂度是O(n),共有n次查找 ...
- react+react-router+react-redux+nodejs+mongodb项目
一个实际项目(OA系统)中的部分功能.这个demo中引入了数据库,数据库使用了mongodb.安装mongodb才能运行完整的功能.要看完整的项目可以移步我的github 技术栈 React v15. ...
- Luogu P1757 通天之分组背包
题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大 ...
- bonding实现网卡负载均衡与高可用
bondingLinux bonding 驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用,用于网络负载均衡及网络冗余.他是解决同一个IP下突破网卡的流量限制的工具,网卡网线对吞吐量是有 ...