bfs版
#include<queue>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=100;
const int M=100;
const int INF=1e9;
struct Edge {
int v,next;
Edge(int v=-1,int next=-1):v(v),next(next){}
}e[M];
int head[N],total;
void init(){
memset(head,-1,sizeof(head));total=0;
}
void adde(int u,int v){
e[total]=Edge(v,head[u]);head[u]=total++;
}
int mx[N],my[N];
int vis[N];
int dx[N],dy[N];
int n,m;
queue<int> qq;
int dis=INF;
int bfs(){
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i=0;i<n;i++){
if(mx[i]==-1){
qq.push(i);dx[i]=0;
}
}
dis=INF;
while(!qq.empty()){
int u=qq.front();qq.pop();
if(dx[u]>dis)break;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dy[v]==-1){
dy[v]=dx[u]+1;
if(my[v]==-1)dis=dy[v];
else {
dx[my[v]]=dy[v]+1;
qq.push(my[v]);
}
}
}
}
return dis!=INF;
}
int dfs(int u){
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dy[v]==dx[u]+1&&!vis[v]){
vis[v]=1;
if(my[v]!=-1&&dy[v]==dis)continue;
if(my[v]==-1||dfs(my[v])){
my[v]=u;
mx[u]=v;
return 1;
}
}
}
return 0;
}
int _hu(){
int ans=0;
memset(mx,-1,sizeof(mx));
memset(my,-1,sizeof(my));
while(bfs()){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
if(mx[i]==-1)ans+=dfs(i);
}
}
return ans;
}
int main(){
return 0;
}
//hdu2819
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=100;
const int M=100;
struct Edge {
int v,next;
Edge(int v=-1,int next=-1):v(v),next(next){}
}e[M];
int head[N],total;
void init(){
memset(head,-1,sizeof(head));total=0;
}
void adde(int u,int v){
e[total]=Edge(v,head[u]);head[u]=total++;
}
int vis[N],match[N];
int dfs(int u){
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(!vis[v]){
vis[v]=1;
if(match[v]==-1||dfs(match[v])){
match[v]=u;
return 1;
}
}
}
return 0;
}
int _hu(int x,int y){
int ans=0;
memset(match,-1,sizeof(match));
for(int i=0;i<x;i++){
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
}
return ans;
}
int main(){
return 0;
}