二分图最大匹配模板
双向图模板:
#include <iostream> #include <cstdio> using namespace std; int e[101][101]; int match[101]; int book[101]; int n,m; int dfs(int u) { int i; for(i=1;i<=n;i++) { if(book[i]==0&&e[u][i]==1) { book[i]=1; //标记点i已访问过 if(match[i]==0||dfs(match[i])) { //更新配对关系 match[i]=u; match[u]=i; return 1;//把dfs(u)置为true } } } return 0; } int main() { freopen("in.txt","r",stdin); int i,j,t1,t2,sum=0; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d",&t1,&t2); e[t1][t2]=1; e[t2][t1]=1; //无向图 } for(i=1;i<=n;i++) match[i]=0; for(i=1;i<=n;i++){ for(j=1;j<=n;j++) book[j]=0; //清空上次搜索时的标记 if(dfs(i)) sum++; //寻找增广路,如果找到,配对数加1. } printf("%d",sum); return 0; }
单向模板(POJ 1274牛和牛棚的匹配)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int e[500][500]; int match[500]; int book[500]; int n,m; int dfs(int u) { int i; for(i=1;i<=m;i++) { if(book[i]==0&&e[u][i]==1) { book[i]=1; //标记点i已访问过 if(match[i]==0||dfs(match[i])) { //更新配对关系 match[i]=u;//注意不是match[u]=i; return 1; } } } return 0; } int main() { //freopen("in.txt","r",stdin); int i,j,t1,t2,sum=0; int k,a; while(scanf("%d%d",&n,&m)!=EOF){ memset(e,0,sizeof(e)); memset(book,0,sizeof(book)); sum=0; for(i=1;i<=n;i++){ scanf("%d",&k); for(j=1;j<=k;j++) { scanf("%d",&a); e[i][a]=1; } } for(i=1;i<=n;i++) match[i]=0; for(i=1;i<=n;i++){ memset(book,0,sizeof(book)); //清空上次搜索时的标记 if(dfs(i)) sum++; //寻找增广路,如果找到,配对数加1. } printf("%d\n",sum); } return 0; }