Asteroids POJ - 3041(二分图匹配)

传送门

题解:

附上代码:


#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

const int MAX_K=1e4+50;
const int MAX_N=5e2+50;
const int MAX_V=2*MAX_N;

int N,K;
int R[MAX_K],C[MAX_K];
vector<int>G[MAX_V];
int match[MAX_V];
bool used[MAX_V];

void add_edge(int u,int v)
{
    G[u].push_back(v);
    G[v].push_back(u);
}

bool dfs(int v)
{
    used[v]=true;
    for(int i=0;i<G[v].size();i++){
        int u=G[v][i],w=match[u];
        if(w<0||!used[w]&&dfs(w)){
            match[v]=u;
            match[u]=v;
            return true;
        }
    }
    return false;
}

int bipartite_matching()
{
    int res=0;
    memset(match,-1,sizeof(match));
    for(int v=0;v<N;v++){
        if(match[v]<0){
            memset(used,0,sizeof(used));
            if(dfs(v)){
                res++;
            }
        }
    }
    return res;
}

int main()
{
    scanf("%d%d",&N,&K);
    for(int i=0;i<K;i++){
        scanf("%d%d",&R[i],&C[i]);
        add_edge(R[i]-1,N+C[i]-1);
    }
    printf("%d\n",bipartite_matching());
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/83042337