hdu 3605 二分图多重匹配

来源:互联网 发布:unity3d卡牌游戏源码 编辑:程序博客网 时间:2024/05/16 10:30
题目大意: N(N<100,000)个人要去M(M<10)个星球,每个人只可以去一些星球,一个星球最多容纳Ki个人,输出是否所有人都可以选择自己的星球。
#include<bits/stdc++.h>using namespace std;int map1[100005][15],top,book[15],f[15][100005],cnt[15],w[15];struct node{    int u,next;}e[100010*3];/*void add(int u,int v){    e[top].u=v;    e[top].next=head[u];    head[u]=top++;}*/int n,m;int dfs(int x){    for(int i=0;i<m;i++)    {        //int u=e[i].u;        if(!book[i]&&map1[x][i])        {            book[i]=1;            if(cnt[i]<w[i])            {                f[i][cnt[i]++]=x;                return 1;            }            for(int j=0;j<cnt[i];j++)            {                if(dfs(f[i][j]))                {                    f[i][j]=x;                    return 1;                }            }        }    }    return 0;}int main(){    while(~scanf("%d%d",&n,&m))    {        memset(map1,0,sizeof(map1));        memset(f,0,sizeof(f));        memset(cnt,0,sizeof(cnt));        //top=0;        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                int a;                scanf("%d",&a);                if(a==1)                {                    map1[i][j]=1;                }            }        }        for(int i=0;i<m;i++)        {            scanf("%d",&w[i]);        }        int flag=1;        for(int i=0;i<n;i++)        {            memset(book,0,sizeof(book));            if(!dfs(i))            {                flag=0;                break;            }        }        if(flag)        {            printf("YES\n");        }        else printf("NO\n");    }}

原创粉丝点击