題意:
有N(<=100000)個人要逃離到M(<=10)個星球..每個人有喜歡的星球與不喜歡的星球..而每個星球的容量是有限的..問能否讓所有人都在自己喜愛的星球上..
題解:
二分圖還是有些東西要搞得...第一次接觸這種問題..開始用網路流暴..結果逾時了...網路流寫好點是可以過的..我的dinic效率太低了..要改進...本題其實是一個二分圖多重匹配的問題..其解法和匈牙利差不多..用一個數組存下之前已經放好的..已備後面的調整..
Program:
#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<stack>#include<string.h>#include<queue>#define ll long long#define esp 1e-5#define MAXN 2000000#define MAXM 50000000#define oo 100000007using namespace std; int C[15],num[15],n,m,line[15][100005];bool arc[100005][15],used[15];bool dfs(int x){ int i,j; for (i=1;i<=m;i++) if (arc[x][i] && !used[i]) { used[i]=true; if (num[i]<C[i]) { line[i][++num[i]]=x; return true; } for (j=1;j<=num[i];j++) if (dfs(line[i][j])) { line[i][j]=x; return true; } } return false;}int getans(){ int i; memset(num,0,sizeof(num)); for (i=1;i<=n;i++) { memset(used,false,sizeof(used)); if (!dfs(i)) return false; } return true;}int main() { int i,j,x; while (~scanf("%d%d",&n,&m)) { for (i=1;i<=n;i++) for (j=1;j<=m;j++) { scanf("%d",&x); arc[i][j]=x; } for (i=1;i<=m;i++) scanf("%d",&C[i]); if (getans()) printf("YES\n"); else printf("NO\n"); } return 0; }