二分图最大匹配
#include<iostream>
using namespace std;
int n,m,k;
int map[MAXN][MAXN];
int link[MAXN],used[MAXN];
int dfs(int x) {
for(int i=1; i<=m; i++) {
if(map[x][i] && ! used[i]) {
used[i]=1;
if(link[i]==-1 || dfs(link[i])) {
link[i]=x;
return 1;
}
}
}
return 0;
}
void work() {
int sum=0;
for(int i=1; i<=n; i++) {
memset(used,0,sizeof(used));
if(dfs(i)) {
sum++;
}
}
cout<<sum<<endl;
}
int main() {
memset(link,-1,sizeof(link));
memset(map,0,sizeof(map));
}
二分图判定(上色)
#include<iostream>
#include<queue>
using namespace std;
int n,m,k;
vector<int>e[MAXN];
int color[MAXN];
bool bfs(int s) {
queue<int> q;
q.push(s);
color[s]=1;
while(!q.empty()) {
int now=q.front();
q.pop();
for(int i=0; i<e[now].size(); i++) {
int v=e[now][i];
if(color[v]==-1) {
color[v]=!color[now];
q.push(v);
}
if(color[v]==color[now]) {
return 0;
}
}
}
return 1;
}
bool dfs(int u) {
for(int i=0; i<e[u].size(); i++) {
int v=e[u][i];
if(!vis[v]) {
vis[v]=1;
if(match[v]==0||dfs(match[v])) {
match[v]=u;
return 1;
}
}
}
return 0;
}
int main() {
for(int i=0; i<MAXN; i++) {
e[i].clear();
}
memset(color,-1,sizeof(color));
}