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. 二次开发中cad字体的总结

    目前手头一个项目,关于制图统一平台的,特别研究了CAD中的字体,总结出来,给需要的朋友,希望少走弯路.1.cad2008中,netload之后,输入注册的命令,提示未知命令解决:将引用中CAD两个dl ...

  2. Servlet笔记3--Servlet生命周期

    Servlet生命周期:

  3. Python中使用LMDB

    在python中使用lmdb linux中,可以使用指令pip install lmdb安装lmdb包. 生成一个空的lmdb数据库文件 # -*- coding: utf-8 -*- import ...

  4. linux系统iostat命令详解

    iostat  -k 3 5  (以KB为单位,每3秒统计一次,共统计5次) • avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值    %user    用户空 ...

  5. ios 个人开发者账户 给其他团队用坑爹的教程

    最新版本的 ios  支持 3个开发者证书 和 3个发布者证书  ,如果是多余3台电脑设备要真机调试,就比较麻烦 (手机支持100个设备) 解决方案就是: 在别人的电脑上要成功安装,须具备两个文件: ...

  6. IntelliJ IDEA + Tomcat 部署问题

    首先要了解下 tomcat的 几种部署方式(大致分为静态部署和动态部署),可以百度,博客:http://qsfwy.iteye.com/blog/466461 IntelliJ IDEA 下部署项目的 ...

  7. javaweb作业一

    作业:Http全称叫什么?有什么特点?端口号是多少?超文本传输协议:(1)遵循请求/响应模型(2)http协议是一种无状态协议,请求/响应完成后,连接会断开.这时,服务器无法知道当前访问的用户是否是老 ...

  8. Maven3核心技术(笔记三)

    第一节:Maven仓库概念 Maven 远程仓库配置文件:$M2_HOME/lib/maven-model-builder-3.3.3.jar 文件:org\apache\maven\model\po ...

  9. sqlserver中的循环遍历(普通循环和游标循环)(转载)

    sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student

  10. 20165203实验四 Andriod程序设计

    20165203实验四 Andriod程序设计 实验内容 安装 Android Stuidio 学习Android Stuidio调试应用程序 实验要求 1.没有Linux基础的同学建议先学习< ...