poj 3041 Asteroids

来源:互联网 发布:擦除软件 编辑:程序博客网 时间:2024/06/05 15:46

最大匹配

#include<iostream>#include<sstream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<set>#include<string>#include<vector>#include<algorithm>using namespace std;#define inf 0x7ffffff#define lc l,m,index<<1#define rc m+1,r,index<<1|1#define max_n 100005#define mod 1000000007#define FOR(i,s,t) for(int i=(s);i<=(t);++i)int V;//顶点数int N,K;int R[max_n],C[max_n];vector<int >G[max_n];int match[max_n];//所匹配的顶点bool used[max_n];//dfs中的标记数组void add_edge(int u,int v){    G[u].push_back(v);    G[v].push_back(u);}bool dfs(int v){    used[v]=1;    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 1;        }    }    return 0;}int bipartite_matching(){    int res=0;    memset(match,-1,sizeof(match));    for(int v=0;v<V;v++){        if(match[v]<0){            memset(used,0,sizeof(used));            if(dfs(v))            res++;        }    }    return res;}int main(){    while(~scanf("%d%d",&N,&K))    {        V=2*N;        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());    }}


0 0
原创粉丝点击