hdu 3605 Escape (二分图的多重匹配)

来源:互联网 发布:谷歌seo初级指南2016 编辑:程序博客网 时间:2024/05/21 01:34

hdu 3605 Escape (二分图的多重匹配)

题意:有m个星球(m<=10),现在有n(n<10w),有些人适合住在一部分星球上,每个星球可以容纳a[i](<100000 )个人,问能否安排所有的人?


题解:典型的二分多重匹配;

注意:(1) 开数组的时候,用link[x][y] 记录第x个星球居住的人!一开始数组开反了,一直WA!!

           (2) 后来搞个输入优化,忘了ret=ret*10+(c-'0'); 忘了乘10!!晕!

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <stack>#include <cmath>#include <vector>#include <queue>#include <map>using namespace std;#define LL long long#define N 100005#define M 12#define DEBUG puts("It's here!")#define INF 1<<29#define CLS(x,v) memset(x,v,sizeof(x))#define FOR(i,a,n)  for(int i=(a);i<=(n);++i)int n,m;int graph[N][M];bool vis[M];vector<int> link[M];//记录第i个星球上住的人int cap[M];//第i个星球上最多住多少人int DFS(int x){    for(int i=1;i<=m;i++)//m个星球    if(!vis[i]&&graph[x][i])//还没住满    {        vis[i]=1;        if(link[i].size()<cap[i])        {            link[i].push_back(x);return 1;        }        for(int k=0;k<link[i].size();k++)        {            if(DFS(link[i][k]))//让别人去住别的星球            {                link[i][k]=x;return 1;            }        }    }    return 0;}int input(){    int ret=0;    char c=getchar();    while(c<'0'||c>'9')c=getchar();    while(c>='0'&&c<='9')    {        ret=ret*10+c-'0';//        c=getchar();    }    return ret;}int main(){    while(~scanf("%d%d",&n,&m))    {        FOR(i,1,m)link[i].clear();        for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)        {            //scanf("%d",&graph[i][j]);            graph[i][j]=input();        }        FOR(i,1,m)cap[i]=input();        int cnt=0;        for(int i=1;i<=n;i++)        {            CLS(vis,0);            if(DFS(i))cnt++;            else break;        }        if(cnt==n)puts("YES");        else puts("NO");    }    return 0;}





0 0
原创粉丝点击