题意:~
思路:
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PI; const int INF = 0x3f3f3f3f; const int MAXN = 1500; const int MAXM = 15000; struct Edge { int to, next, cap, flow; } edge[MAXM]; int tol; int head[MAXN]; int gg[205][205]; void init() { tol = 2; memset(head, -1, sizeof(head)); } void addedge(int u, int v, int w, int rw = 0) { edge[tol] = (Edge){v, head[u], w, 0}; gg[u][v] = tol; head[u] = tol++; edge[tol] = (Edge){u, head[v], rw, 0}; gg[v][u] = tol; head[v] = tol++; } int Q[MAXN]; int dep[MAXN], cur[MAXN], sta[MAXN]; bool bfs(int s, int t, int n) { int front = 0, tail = 0; memset(dep, -1, sizeof(dep[0]) * (n + 1)); dep[s] = 0; Q[tail++] = s; while(front < tail) { int u = Q[front++]; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dep[v] == -1) { dep[v] = dep[u] + 1; if(v == t) return true; Q[tail++] = v; } } } return false; } int dinic(int s, int t, int n) { int maxflow = 0; while(bfs(s, t, n)) { for(int i = 0; i < n; ++i) cur[i] = head[i]; int u = s, tail = 0; while(cur[s] != -1) { if(u == t) { int tp = INF; for(int i = tail - 1; i >= 0; i--) tp = min(tp, edge[sta[i]].cap - edge[sta[i]].flow); maxflow += tp; for(int i = tail - 1; i >= 0; i--) { edge[sta[i]].flow += tp; edge[sta[i] ^ 1].flow -= tp; if(edge[sta[i]].cap - edge[sta[i]].flow == 0) tail = i; } u = edge[sta[tail] ^ 1].to; } else if(cur[u] != -1 && edge[cur[u]].cap > edge[cur[u]].flow && dep[u] + 1 == dep[edge[cur[u]].to]) { sta[tail++] = cur[u]; u = edge[cur[u]].to; } else { while(u != s && cur[u] == -1) u = edge[sta[--tail] ^ 1].to; cur[u] = edge[cur[u]].next; } } } return maxflow; } int a[100], b[100]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; bool ff = 0; while(cin >> n >> m) { if(n == 0 && m == 0) break; if(ff) cout << endl; ff = 1; int s1 = 0, s2 = 0; for(int i = 1; i <= n; ++i) { cin >> a[i]; s1 += a[i]; } for(int i = 1; i <= m; ++i) { cin >> b[i]; s2 += b[i]; } if(s1 != s2) { cout << "Impossible" << endl; continue; } init(); int st = 0, ed = n + m + 1; for(int i = 1; i <= n; i++) { addedge(st, i, a[i]); for(int j = 1; j <= m; j++) addedge(i, n + j, 1); } for(int i = 1; i <= m; i++) { addedge(n + i, ed, b[i]); } int ans = dinic(st, ed, n + m + 2); if(ans != s1) { cout << "Impossible" << endl; continue; } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { int to = gg[i][j + n]; if(edge[to].cap == edge[to].flow) { edge[gg[st][i]].cap++; edge[gg[j + n][ed]].cap++; if(dinic(st, ed, n + m + 2)) cout << "N"; else { edge[gg[st][i]].cap--; edge[gg[j + n][ed]].cap--; cout << "Y"; } } else { edge[to].cap = 0; cout << "N"; } } cout << endl; } } return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1425 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!