BZOJ 1191 匈牙利算法

来源:互联网 发布:怎么查看 sqlserver 编辑:程序博客网 时间:2024/05/16 06:38

  一道比较明显的二分图匹配。。。我们可以把问题和锦囊妙计看成两个点集,将问题与它所能使用的锦囊妙计连一条有向边,然后在二分图中用匈牙利算法求最大匹配

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 10005int pre[maxn],last[maxn],other[maxn];int link[maxn],l,n,m,ans;bool flag[maxn]; void connect(int x,int y){    l++;    pre[l]=last[x];    last[x]=l;    other[l]=y; } bool check(int u){    for (int p=last[u];p;p=pre[p])     {        int v=other[p];        if (!flag[v])         {            flag[v]=1;            if (link[v]==0||check(link[v]))             {                link[v]=u;                return 1;               }        }    }    return 0;} int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=m;i++)     {        int a,b;        scanf("%d%d",&a,&b);        connect(i,a);        connect(i,b);       }    for (int i=1;i<=m;i++)     {        memset(flag,0,sizeof flag);        if (check(i)) ans++;else break;     }    printf("%d\n",ans);    return 0;   }


1 0
原创粉丝点击