洛谷3386二分图模板

题目:https://www.luogu.org/problemnew/show/P3386

注意代码中标记处。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,e,x,y,xnt,head[1005],pre[1005],ans;
bool vis[1005],in[1005];
struct Node{
    int next,to;
}edge[1000005];
void add(int x,int y)
{
    edge[++xnt].next=head[x];
    edge[xnt].to=y;
    head[x]=xnt;
}
bool dfs(int a)
{
    for(int i=head[a],v;i;i=edge[i].next)
    {
        if(vis[v=edge[i].to])continue;
        vis[v]=1;/////
        if(!pre[v]||dfs(pre[v]))
        {
            pre[v]=a;
            return true;
        }
    }
    return false;
}
int main()
{
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1;i<=e;i++)
    {
        scanf("%d%d",&x,&y);
        if(x>n||y>m)continue;
        add(x,y);
    }
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof vis);
        if(!in[i])
            if(dfs(i))in[i]=1,ans++;
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/8516232.html