二分图匹配
一个简单的三维二分图匹配,把二维遍历改成3维遍历即可
直接上代码:
#include<iostream>//course:¿Î³Ì
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,course[301][8][13];
int vis[8][13],win[8][13];
int dfs(int x)
{
for(int i=1;i<=7;i++)
{
for(int j=1;j<=12;j++)
{
if(!vis[i][j]&&course[x][i][j])
{
vis[i][j]=1;
if(!win[i][j]||dfs(win[i][j]))
{
win[i][j]=x;
return 1;
}
}
}
}
return 0;
}
int main()
{
int x,a,b,ans;
while(scanf("%d",&n)!=EOF)
{
memset(course,0,sizeof(course));
memset(win,0,sizeof(win));
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
for(int j=0;j<x;j++)
{
scanf("%d%d",&a,&b);
course[i][a][b]=1;
}
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}