二分图的最大匹配模板

来源:互联网 发布:中文翻译藏文软件下载 编辑:程序博客网 时间:2024/06/07 08:47
//二分图的最大匹配 poj1469#define  _CRT_SECURE_NO_WARNINGS#include<iostream>#include<algorithm>#include<vector>#include<cstdio>using namespace std;const int V = 500;const int E = 1000;vector<int>g[V];bool flag, vis[V];int match[V];int p, n;//二分图中左边、右边集合中顶点的数目  bool dfs(int u){for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!vis[v]) {vis[v] = true;if (match[v] == -1 || dfs(match[v])) {///如果i未在前一个匹配M中,或者i在匹配M中,但是从与i相邻的节点出发可以有增广路径  match[v] = u;return true;}}}return false;}int main(){int i, j, k, t, v, ans;scanf("%d", &t);while (t--){scanf("%d%d", &p, &n);for (i = 0; i < V; i++)g[i].clear();memset(match, -1, sizeof(match));flag = true;for (i = 1; i <= p; i++) {scanf("%d", &k);if (k == 0)flag = false;while (k--){scanf("%d", &v);g[i].push_back(v);}}if (flag) {ans = 0;for (i = 1; i <= p; i++) {memset(vis, false, sizeof(vis));if (dfs(i))ans++;}if (ans == p)printf("YES\n");else printf("NO\n");}}return 0;}

//邻接表实现 poj1274#include<stdio.h>#include<memory.h>#define MAX 202bool flag,visit[MAX];    //记录V2中的某个点是否被搜索过int match[MAX];   //记录与V2中的点匹配的点的编号int cow, stall;   //二分图中左边、右边集合中顶点的数目int head[MAX];struct edge{    int to,next;}e[3000];int index;void addedge(int u,int v){   //向图中加边的算法,注意加上的是有向边//u为v的后续节点既是v---->u    e[index].to=v;    e[index].next=head[u];    head[u]=index;index++;}// 匈牙利(邻接表)算法bool dfs(int u){int i,v;    for(i = head[u]; i != 0; i = e[i].next){v = e[i].to;        if(!visit[v])   //如果节点v与u相邻并且未被查找过{            visit[v] = true;   //标记v为已查找过            if(match[v] == -1 || dfs(match[v]))   //如果i未在前一个匹配M中,或者i在匹配M中,但是从与i相邻的节点出发可以有增广路径{                match[v] = u;  //记录查找成功记录,更新匹配M(即“取反”)                return true;   //返回查找成功            }        }    }    return false;}int MaxMatch(){int i,sum=0;memset(match,-1,sizeof(match));for(i = 1 ; i <= cow ; ++i){memset(visit,false,sizeof(visit));   //清空上次搜索时的标记if( dfs(i) )    //从节点i尝试扩展{sum++;}}return sum;}int main(void){    int i,j,k,ans,m;while (scanf("%d %d",&cow, &stall)!=EOF){memset(head,0,sizeof(head));    //切记要初始化index = 1;for (i = 1; i <= cow; ++i){scanf("%d",&k);for (j = 0; j < k; ++j){scanf("%d",&m);addedge(i , m);}}ans = MaxMatch();printf("%d\n",ans);}return 0;}

原创粉丝点击