POJ 1469 COURSES 二分图最大匹配 二分图
http://poj.org/problem?id=1469
这道题我绝壁写过但是以前没有mark过二分图最大匹配的代码mark一下。
匈牙利 O(mn)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
int n,m;
struct nod{
int y,next;
}e[maxn*maxn];
int head[maxn]={},tot=;
int p[maxn]={},vis[maxn]={};
inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
bool dfs(int x){
for(int i=head[x];i;i=e[i].next){
if(!vis[e[i].y]){
vis[e[i].y]=;
if((!p[e[i].y])||dfs(p[e[i].y])){
p[e[i].y]=x;
return ;
}
}
}return ;
}
int main(){
int T;scanf("%d",&T);
while(T-->){
scanf("%d%d",&n,&m);
memset(p,,sizeof(p));
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));tot=;
int x,y;
for(int i=;i<=n;i++){
scanf("%d",&x);
for(int j=;j<=x;j++){scanf("%d",&y);init(i,y);}
}
int ans=;
for(int i=;i<=n;i++){memset(vis,,sizeof(vis));if(dfs(i))++ans;}
if(ans==n)printf("YES\n");
else printf("NO\n");
}
return ;
}
hopcroft-karp O(sqrt(n)m)
https://blog.csdn.net/wall_f/article/details/8248373
是一种魔改版匈牙利,魔改之后竟然有点像网络流。不过我用网络流找最大匹配差不多也是这个复杂度吧,这个算法有什么意义吗。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
const int minf=;
int n,m,dis;
struct nod{
int y,next;
}e[maxn*];
int head[maxn]={},tot=;
int vis[maxn]={};
int cx[maxn]={},cy[maxn]={},dx[maxn]={},dy[maxn]={};
inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
bool bfs(){
memset(dx,-,sizeof(dx));memset(dy,-,sizeof(dy));
dis=minf;queue<int>q;
for(int i=;i<=n;i++){if(!cx[i]){q.push(i);dx[i]=;}}
while(!q.empty()){
int x=q.front();q.pop();
if(dx[x]>dis)break;
for(int i=head[x];i;i=e[i].next){
int y=e[i].y;
if(dy[y]==-){
dy[y]=dx[x]+;
if(!cy[y])dis=dy[y];
else {dx[cy[y]]=dy[y]+;q.push(cy[y]);}
}
}
}
return dis!=minf;
}
int dfs(int x){
for(int i=head[x];i;i=e[i].next){
int y=e[i].y;
if((!vis[y])&&dy[y]==dx[x]+){
vis[y]=;
if(cy[y]&&dy[y]==dis)continue;
if((!cy[y])||dfs(cy[y])){
cy[y]=x;cx[x]=y;
return ;
}
}
}
return ;
}
int main(){
int T;scanf("%d",&T);
while(T-->){
scanf("%d%d",&n,&m);
memset(head,,sizeof(head));tot=;
int x,y;
for(int i=;i<=n;i++){
scanf("%d",&x);
for(int j=;j<=x;j++){scanf("%d",&y);init(i,y);}
}
int ans=;
memset(cx,,sizeof(cx));
memset(cy,,sizeof(cy));
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
if(!cx[i])ans+=dfs(i);
}
}
if(ans==n)printf("YES\n");
else printf("NO\n");
}
return ;
}
POJ 1469 COURSES 二分图最大匹配 二分图的更多相关文章
- POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配
两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...
- poj 1469 COURSES 题解
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21515 Accepted: 8455 Descript ...
- poj 1469 COURSES(匈牙利算法模板)
http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj 1469 COURSES (二分图模板应用 【*模板】 )
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18454 Accepted: 7275 Descript ...
- poj——1469 COURSES
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24192 Accepted: 9426 Descript ...
- POJ 1469 COURSES
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20478 Accepted: 8056 Descript ...
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
[题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...
- poj 1469 COURSES (二分匹配)
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16877 Accepted: 6627 Descript ...
- poj 1469 COURSES 解题报告
题目链接:http://poj.org/problem?id=1469 题目意思:有 N 个人,P个课程,每一个课程有一些学生参加(0个.1个或多个参加).问 能否使得 P 个课程 恰好与 P 个学生 ...
随机推荐
- 2016.07.13-vector<vector<int>>应用2——Two Sum扩展
收获: vector<vector<int> >res,不能直接用res[j].push_back(number),因为res[j]是空的,没有初始化 可以先定义 vector ...
- 解决java计算中double类型结果不一致问题,使用BigDecimal解决
一.需求:从数据表中读出一个double的数据,比如是3.5,没问题,但是如果再用3.5进行计算,比如乘以100,结果就是350了,而是35000000004 因为是浮点运算,所有语言中的浮点数都会有 ...
- Dummynet模拟高时延网络场景(Windows7)
如果安装时出现:my_socket failed 2, cannot talk to kernel module 请查看是否以管理员方式运行,如果是,再判断当前操作系统是否为Win7 64位,如果是, ...
- kworker内核工作队列详解
工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠. 区分使用软中断/tasklet还是工作队列比较简单,如 ...
- 串口流控制详解(CTS/RTS,DTR/DSR)
1 首先看下关于流控相关的几个端口的解释如下图 除了必要的地(GND)要连接外,其它连如下 步骤阅读 2 计算机和猫(MODEM)的连接 步骤阅读 步骤阅读 3 计算机和非猫的连接(null mod ...
- aarch64_n1
NFStest-2.1.5-0.fc26.noarch.rpm 2017-02-17 01:19 531K fedora Mirroring Project NLopt-2.4.2-11.fc26.a ...
- MySQL 5.7.17 Group Relication(组复制)搭建手册【转】
本博文介绍了Group Replication的两种工作模式的架构.并详细介绍了Single-Master Mode的部署过程,以及如何切换到Multi-Master Mode.当然,文末给出了Gro ...
- ifdef等宏的妙用
条件编译 一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译". 条件编译命令最常见 ...
- 十、springcloud之Consul注销实例
@Autowired //com.ecwid.consul.v1.ConsulClient private ConsulClient consulClient; @PostMapping(" ...
- docker stack 部署 redis
=============================================== 2019/4/16_第2次修改 ccb_warlock 更新 ...