Advertisement
Waliul

Diagonal Sum

May 27th, 2021
751
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define mx 200
  5. int rgraph[mx][mx], parent[mx];
  6. int nodes, src, sink;
  7.  
  8. struct Edge
  9. {
  10.     int v, flow, c, rev;
  11. };
  12.  
  13. class Graph
  14. {
  15.     int V;
  16.     int *level;
  17.     vector<Edge>*adj;
  18. public:
  19.     Graph(int V)
  20.     {
  21.         adj = new vector<Edge>[V];
  22.         this->V = V;
  23.         level = new int[V];
  24.     }
  25.     void addEdge(int u, int v, int C)
  26.     {
  27.         Edge a{v, 0, C, adj[v].size()};
  28.         Edge b{u, 0, 0, adj[u].size()};
  29.         adj[u].push_back(a);
  30.         adj[v].push_back(b);
  31.     }
  32.     void makeEdge(int n, int m);
  33.     bool BFS(int s, int t);
  34.     int sendFlow(int s, int flow, int t, int ptr[]);
  35.     int DinicMaxFlow(int s, int t);
  36. };
  37.  
  38. bool Graph::BFS(int s = src, int t = sink)
  39. {
  40.     for(int i = 0; i < V; i++)
  41.         level[i] = -1;
  42.     level[s] = 0;
  43.     queue<int>q;
  44.     q.push(s);
  45.     vector<Edge>::iterator it;
  46.     while(!q.empty())
  47.     {
  48.         int u = q.front();
  49.         q.pop();
  50.         for(it = adj[u].begin(); it != adj[u].end(); it++)
  51.         {
  52.             Edge &e = *it;
  53.             if(level[e.v] < 0 && e.flow < e.c)
  54.             {
  55.                 level[e.v] = level[u] + 1;
  56.                 q.push(e.v);
  57.             }
  58.         }
  59.     }
  60.     return level[t] < 0 ? false : true;
  61. }
  62.  
  63. int Graph::sendFlow(int u, int flow, int t, int start[])
  64. {
  65.     if(u == t)
  66.         return flow;
  67.     for( ; start[u] < adj[u].size(); start[u]++)
  68.     {
  69.         Edge &e = adj[u][start[u]];
  70.         if(level[e.v] == level[u] + 1 && e.flow < e.c)
  71.         {
  72.             int curr_flow = min(flow, e.c - e.flow);
  73.             int temp_flow = sendFlow(e.v, curr_flow, t, start);
  74.             if(temp_flow > 0)
  75.             {
  76.                 e.flow += temp_flow;
  77.                 adj[e.v][e.rev].flow -= temp_flow;
  78.                 rgraph[u][e.v] += temp_flow;
  79.                 rgraph[e.v][u] -= temp_flow;
  80.                 return temp_flow;
  81.             }
  82.         }
  83.     }
  84.     return 0;
  85. }
  86.  
  87. int Graph::DinicMaxFlow(int s = src, int t = sink)
  88. {
  89.     if(s == t)
  90.         return -1;
  91.     int total = 0;
  92.     while(BFS() == true)
  93.     {
  94.         int *start = new int[V+1] {0};
  95.         while(int flow = sendFlow(s, INT_MAX, t, start))
  96.             total += flow;
  97.     }
  98.     return total;
  99. }
  100.  
  101. void Graph::makeEdge(int n, int m)
  102. {
  103.     int i, j, k, u, v;
  104.     for(i = 1; i <= n; i++)
  105.     {
  106.         for(j = 1; j <= m; j++)
  107.         {
  108.             u = i + j - 1;
  109.             v = n + 2*m - 1 + i - j;
  110.             //rgraph[u][v] = 99;
  111.             addEdge(u, v, 99);
  112.         }
  113.     }
  114. }
  115.  
  116. int main()
  117. {
  118.     ios_base::sync_with_stdio(false);
  119.     cin.tie(NULL);
  120.     int m, n, i, j, k, t, kase(0), nd, mn, sub, r__g, u, v;
  121.     scanf("%d", &t);
  122.     while(t-- && ++kase)
  123.     {
  124.         scanf("%d %d", &n, &m);
  125.         nodes = 2 * (n + m);
  126.         Graph MAT(nodes);
  127.         src = 0, sink = nodes - 1, nd = 1;
  128.         k = n + m - 1;
  129.         mn = min(m, n);
  130.         int left[k], right[k];
  131.         for(i = 0; i < k; i++)
  132.             scanf("%d", &left[i]);
  133.         for(i = 0; i < k; i++)
  134.             scanf("%d", &right[i]);
  135.  
  136.         memset(rgraph, 0, sizeof(rgraph));
  137.         //start of making the nodes
  138.         for(i = 0, sub = 1; i < k; i++, nd++)
  139.         {
  140.             if((i+1) < mn)
  141.             {
  142.                 MAT.addEdge(src, nd, left[i] - sub);
  143.                 sub++;
  144.             }
  145.             else if((i+1) >= mn && (n + m - (i+1)) >= mn)
  146.                 MAT.addEdge(src, nd, left[i] - sub);
  147.             else
  148.             {
  149.                 --sub;
  150.                 MAT.addEdge(src, nd, left[i] - sub);
  151.             }
  152.             r__g = rgraph[src][nd];
  153.         }
  154.         for(i = 0, sub = 1; i < k; i++, nd++)
  155.         {
  156.             if((i+1) < mn)
  157.             {
  158.                 MAT.addEdge(nd, sink, right[i] - sub);
  159.                 sub++;
  160.             }
  161.             else if((i+1) >= mn && (n + m - (i+1)) >= mn)
  162.                 MAT.addEdge(nd, sink, right[i] - sub);
  163.             else
  164.             {
  165.                 --sub;
  166.                 MAT.addEdge(nd, sink, right[i] - sub);
  167.             }
  168.             r__g = rgraph[nd][sink];
  169.         }
  170.         //end of making the nodes
  171.  
  172.         MAT.makeEdge(n, m);
  173.  
  174.         MAT.DinicMaxFlow();
  175.         printf("Case %d:\n", kase);
  176.         for(i = 1; i <= n; i++)
  177.         {
  178.             for(j = 1; j <= m - 1; j++)
  179.             {
  180.                 u = i + j - 1;
  181.                 v = n + 2*m - 1 + i - j;
  182.                 printf("%d ", rgraph[u][v] + 1);
  183.             }
  184.             u = i + j - 1;
  185.             v = n + 2*m - 1 + i - j;
  186.             printf("%d", rgraph[u][v] + 1);
  187.             printf("\n");
  188.         }
  189.     }
  190.     return 0;
  191. }
  192.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement