二分图匹配模板

代码

//maxn,n取二分图两方中点数的最大值,首先init,然后在输入中加边AddEdge,
//最后调用solve
struct edge
{
    int v,next;
}E[2*maxn];
struct TwoMatch
{
    int head[maxn],eid;
    bool vis[maxn];
    int n,To[maxn];
    void init(int nn)
    {
        n=nn; eid=0;
        for(int i=1;i<=n;i++) head[i]=-1;
    }
    void AddEdge(int u,int v)
    {
        E[++eid].v=v; E[eid].next=head[u]; head[u]=eid;
    }
    bool dfs(int u)
    {
        for(int i=head[u];i!=-1;i=E[i].next)
        {
            int v=E[i].v;
            if(vis[v]) continue;
            vis[v]=true;
            if(To[v]==-1||dfs(To[v]))
            {
                To[v]=u;
                return true;
            }
        }
        return false;
    }
    int solve()
    {
        int ans=0;
        for(int i=1;i<=n;i++) To[i]=-1;
        for(int i=1;i<=n;i++)
        {
            memset(vis,false,sizeof(vis));
            if(dfs(i)) ans++;
        }
        return ans;
    }
}tm;
View Code

 

posted @ 2016-08-24 08:47  wust_ouyangli  阅读(134)  评论(0编辑  收藏  举报