HDU 3609 二分圖多重匹配
阿新 • • 發佈:2018-11-09
Escape
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 13005 Accepted Submission(s): 3258
The last line has m digits, the ith digit ai indicates the ith planet can contain ai people most..
0 <= ai <= 100000
If you can output YES, otherwise output NO.
Sample Input 1 1 1 1 2 2 1 0 1 0 1 1 Sample Output YES NO AC程式碼
#include <bits/stdc++.h> #definepb push_back #define mp make_pair #define fi first #define se second #define all(a) (a).begin(), (a).end() #define fillchar(a, x) memset(a, x, sizeof(a)) #define huan printf("\n") #define debug(a,b) cout<<a<<" "<<b<<" "<<endl #define ffread(a) fastIO::read(a) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 1e5+10;//左集合大小 const int MAXM = 15;//右集合大小 int uN,vN;//左右集合的數量 int g[MAXN][MAXM]; int linker[MAXM][MAXN]; bool used[MAXM]; int num[MAXM];//右集合的限制 bool dfs(int u) { for(int v = 0; v < vN; v++) if(g[u][v] && !used[v]) { used[v] = true; if(linker[v][0] < num[v]) { linker[v][++linker[v][0]] = u; return true; } for(int i = 1; i <= num[v]; i++) if(dfs(linker[v][i])) { linker[v][i] = u; return true; } } return false; } int hungary() { int res = 0,flag=0; for(int i = 0; i < vN; i++) linker[i][0] = 0; for(int u = 0; u < uN; u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; else //當前人不能匹配 直接就是NO了 { flag=1; break; } } return flag; } int main() { while(scanf("%d%d",&uN,&vN)!=EOF) { for(int i=0;i<uN;i++) for(int j=0;j<vN;j++) scanf("%d",&g[i][j]); for(int i=0;i<vN;i++) scanf("%d",&num[i]); if(hungary()) puts("NO"); else puts("YES"); } }