挑战 poj 3041 二分图最大匹配算法 (匈牙利算法)

来源:互联网 发布:爱淘宝天猫购物券 编辑:程序博客网 时间:2024/06/07 22:02

原来这就是匈牙利算法,,,

就是用来求二分图最大匹配的算法。。

代码比较短。。

还有就是这里V会是1000,  所以maxn为1005;


#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<queue>using namespace std;#define mem(a,b) memset(a,b,sizeof(a));#define sf scanf#define pf printf#define LL long long#define bug1  cout<<"bug1"<<endl;#define bug2  cout<<"bug2"<<endl;#define bug3  cout<<"bug3"<<endl;const int maxn=1005;int V;vector<int>G[maxn];int match[maxn];bool used[maxn];void addedge(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 biparitte_matching(){    int res=0;    mem(match,-1);    for(int v=0;v<V;++v){        if(match[v]<0){            mem(used,0);            if(dfs(v)){                res++;            }        }    }    return res;}int n,k;int R[10005],C[10005];int main(){    while(~sf("%d%d",&n,&k)){        V=n*2;        for(int i=1;i<=k;++i){            sf("%d%d",&R[i],&C[i]);        }        for(int i=1;i<=k;++i){            addedge(R[i]-1,n+C[i]-1);//G[i]         }        int res=biparitte_matching();        pf("%d\n",res);    }}

0 0
原创粉丝点击