poj3041

题解:

二分图

当x,y有点的时候,加边x->y

然后二分图最大匹配

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=505;
int f[N],a[N][N],n,m,x,y,match[N];
int dfs(int x)
{
    for (int i=1;i<=n;i++)
     if (a[x][i]&&!f[i])
      {
          f[i]=1;
          if (!match[i]||dfs(match[i]))
           {
               match[i]=x;
               return 1;
           }
      }
    return 0;  
}
int main()
{
    scanf("%d%d",&n,&m);
    while (m--)
     {
         scanf("%d%d",&x,&y);
         a[x][y]=1;
     }
    int ans=0; 
    for (int i=1;i<=n;i++)
     {
         memset(f,0,sizeof f);
         ans+=dfs(i);
     } 
    printf("%d
",ans); 
}
原文地址:https://www.cnblogs.com/xuanyiming/p/8229082.html