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 二分图最大匹配 二分图的更多相关文章

  1. POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配

    两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...

  2. poj 1469 COURSES 题解

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21515   Accepted: 8455 Descript ...

  3. poj 1469 COURSES(匈牙利算法模板)

    http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  4. poj 1469 COURSES (二分图模板应用 【*模板】 )

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18454   Accepted: 7275 Descript ...

  5. poj——1469 COURSES

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24192   Accepted: 9426 Descript ...

  6. POJ 1469 COURSES

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20478   Accepted: 8056 Descript ...

  7. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)

    [题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...

  8. poj 1469 COURSES (二分匹配)

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16877   Accepted: 6627 Descript ...

  9. poj 1469 COURSES 解题报告

    题目链接:http://poj.org/problem?id=1469 题目意思:有 N 个人,P个课程,每一个课程有一些学生参加(0个.1个或多个参加).问 能否使得 P 个课程 恰好与 P 个学生 ...

随机推荐

  1. python基础之命名空间

    前言 命名空间通俗的理解就是对象或变量的作用范围,在python中分为局部命令空间.模块命名空间和build-in全局命名空间. 局部命名空间 局部命名空间即在一个函数或一个类中起作用的变量或引用的字 ...

  2. Codechef AMXOR

    Problem Codechef Solution 我们可以按位进行考虑,如果一个 \(m_i\) 在某一位上为1,但 \(x_i\) 却取了0,那么我们就称它脱离了限制,更低位可以随便乱填.也就是说 ...

  3. 2->集群架构主机优化流程

    集群架构优化流程: 有道笔记分享链接

  4. 在jsp页面中设置了远程验证,在初始化时必须预先调用一次。

    参考链接:http://code.taobao.org/p/sztaotao/diff/5/trunk/code/src/main/webapp/webpage/modules/sys/roleFor ...

  5. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  6. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  7. python目录/文件操作

    目录操作 sys.argv[0] # 获得当前脚本路径,即当前工作目录\脚本名 os.getcwd() # 获得当前工作目录 os.path.abspath('.') # 获得当前工作目录 os.pa ...

  8. Centos7.3安装和配置jre1.8

    在正式环境里 我们可以不安装jdk ,仅仅安装Java运行环境 jre即可: 第一步:下载jre 我们去oracle官方下载下jre http://www.oracle.com/technetwork ...

  9. 12 打印1到最大的n位数

    输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...

  10. C语言:打印A-Z字母组合的菱形图案

    题目: +++++++++A+++++++++++++++++BCD+++++++++++++++EFGHI+++++++++++++JKLMNOP+++++++++++QRSTUVWXY++++++ ...