UVA11082MatrixDecompressing

来源:互联网 发布:斗鱼主播都用什么软件 编辑:程序博客网 时间:2024/05/24 01:45
//UVA11082MatrixDecompressing#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<algorithm>using namespace std;const int INF = 1000000000;const int maxn = 50 + 5;const int maxe = maxn * maxn;int idx[maxn][maxn];struct Edge {int from, to, cap, flow;Edge(int u, int v, int c, int f) : from(u), to(v), cap(c), flow(f) {}};struct EdmondsKarp {int n, m;vector<Edge> edges;vector<int> G[maxn];int a[maxn];int p[maxn];void init(int n) {for(int i = 0; i < n; i++) G[i].clear();edges.clear();}void AddEdge(int from, int to, int cap) {edges.push_back(Edge(from, to, cap, 0));edges.push_back(Edge(to, from, 0, 0));m = edges.size();G[from].push_back(m - 2);G[to].push_back(m - 1);} int Maxflow(int s, int t) {int flow = 0;while(1) {memset(a, 0, sizeof(a));queue<int> Q;Q.push(s);a[s] = INF;while(!Q.empty()) {int x = Q.front(); Q.pop();for(int i = 0; i < G[x].size(); i++) {Edge& e = edges[G[x][i]];if(!a[e.to] && e.cap > e.flow) {p[e.to] = G[x][i];a[e.to] = min(a[x], e.cap - e.flow);Q.push(e.to);}}if(a[t]) break;}if(!a[t]) break;for(int u = t; u != s; u = edges[p[u]].from) {edges[p[u]].flow += a[t];edges[p[u] ^ 1].flow -= a[t];}flow += a[t];}return flow;}};int main() {int T;scanf("%d", &T);int R, C;for(int kase = 1; kase <= T; kase++) {memset(idx, 0, sizeof(idx));scanf("%d%d", &R, &C);int last = 0;EdmondsKarp g;g.init(R + C + 2);int v;for(int i = 1; i <= R; i++) {scanf("%d", &v);g.AddEdge(0, i, v - last - C);last = v; }last = 0;for(int j = 1; j <= C; j++) {scanf("%d", &v);g.AddEdge(R + j, R + C + 1, v - last - R);last = v; }for(int i = 1; i <= R; i++) {for(int j = 1; j <= C; j++) {g.AddEdge(i, R + j, 19);idx[i][j] = g.edges.size() - 2; } }if(kase != 1) printf("\n");printf("Matrix %d\n", kase);g.Maxflow(0, R + C + 1);for(int i = 1; i <= R; i++) {for(int j = 1; j <= C; j++) {if(j != 1) printf(" ");printf("%d", g.edges[idx[i][j]].flow + 1);}printf("\n");}}return 0;} /*23 410 31 5810 20 37 583 410 31 5810 20 37 58*/

原创粉丝点击