二分图
来源:互联网 发布:淘宝子账号是干嘛的 编辑:程序博客网 时间:2024/05/18 00:02
简单二分图板子
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <cmath>using namespace std;typedef long long LL;const int MaxN = 1000;using namespace std;struct node{ int x , y;}a[MaxN + 5] , b[MaxN + 5];vector<int> G[MaxN + 5];bool vis[MaxN + 5];int n , match[MaxN + 5];bool dfs(int x){ vis[x] = true;//当前点匹配好了 for(int i = 0 ; i < G[x].size() ; i++){ int v = G[x][i] , w = match[v]; if(w < 0 || !vis[w] && dfs(w)){//若v点没有匹配,||之前匹配的还有其他的点可以匹配 match[v] = w;//就挨个匹配嘛 match[x] = v; return true;//找到了 } } return false;}void build(int u , int v){ G[u].push_back(v); G[v].push_back(u);}void Init(){ 一顿建图}int matching()//匹配个数{ for(int i = 1 ; i <= MaxN ; i++) G[i].clear(); int ans = 0; memset(match , -1 , sizeof(match)); for(int i = 1 ; i <= n ; i++){ if(match[i] == -1){ memset(vis , 0 , sizeof(vis)); if(dfs(i)) ans++; } } return ans;}