二分图相关模板

简介: 二分图相关模板

二分图最大匹配

#include<iostream>
using namespace std;
int n,m,k;
int map[MAXN][MAXN];//存储二分图的关系
int link[MAXN],used[MAXN];//link=-1是未连接,used代表是否用过
int dfs(int x) {
  for(int i=1; i<=m; i++) {//注意此处的m,右部的大小,map[][m] 
    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++) {//注意此处n,左部的大小,map[n][] 
    memset(used,0,sizeof(used));//每次都要把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];//用vector存图
int color[MAXN];
bool bfs(int s) {//上色代码 
  queue<int> q;
  q.push(s);
  color[s]=1;//上色 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) {//如果没上过色,上色为!1,也就是0,未上色是-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));
}
目录
相关文章
最小生成树(模板)
最小生成树(模板)
29 0
|
6月前
线段树模板
线段树模板
44 0
背包问题(模板)
背包问题(模板)
49 0
|
存储 算法 UED
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(上)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
80 0
|
算法 容器
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(下)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
107 0
|
存储 算法
线段树模板与练习
线段树模板与练习
100 0
|
项目管理
求组合数(模板)【组合数学】
求组合数(模板)【组合数学】
137 0
求组合数(模板)【组合数学】
计算几何模板
计算几何模板
64 0
|
人工智能 BI C语言
【数论】【模板】
【数论】【模板】
98 0