Advertisement
Waliul

Diagonal Sum

Apr 7th, 2021
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 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. void makeEdge(int n, int m)
  9. {
  10.     int i, j, k, u, v;
  11.     for(i = 1; i <= n; i++)
  12.     {
  13.         for(j = 1; j <= m; j++)
  14.         {
  15.             u = i + j - 1;
  16.             v = n + 2*m - 1 + i - j;
  17.             rgraph[u][v] = 99;
  18.         }
  19.     }
  20. }
  21.  
  22. bool isPath(int s = src, int t = sink)
  23. {
  24.     bool visited[mx];
  25.     int u, uv;
  26.     memset(visited, false, sizeof(visited));
  27.     visited[s] = true;
  28.     queue<int>q;
  29.     q.push(s);
  30.     parent[s] = -1;
  31.     while(!q.empty())
  32.     {
  33.         u = q.front();
  34.         q.pop();
  35.         for(int v = 0; v <= nodes; v++)
  36.         {
  37.             uv = rgraph[u][v];
  38.             if(!visited[v] && rgraph[u][v] > 0)
  39.             {
  40.                 parent[v] = u;
  41.                 visited[v] = true;
  42.                 q.push(v);
  43.             }
  44.         }
  45.     }
  46.     if(visited[t])
  47.         return true;
  48.     return false;
  49. }
  50.  
  51. void maxFlow()
  52. {
  53.     int u, v;
  54.     while(isPath())
  55.     {
  56.         int path_flow = 10000000;
  57.         for(v = sink; v != src; v = parent[v])
  58.         {
  59.             u = parent[v];
  60.             path_flow = min(path_flow, rgraph[u][v]);
  61.         }
  62.         for(v = sink; v != src; v = parent[v])
  63.         {
  64.             u = parent[v];
  65.             rgraph[u][v] -= path_flow;
  66.             rgraph[v][u] += path_flow;
  67.         }
  68.     }
  69.  
  70. }
  71.  
  72. int main()
  73. {
  74.     int m, n, i, j, k, t, kase(0), nd, mn, sub, r__g, u, v;
  75.     scanf("%d", &t);
  76.     while(t-- && ++kase)
  77.     {
  78.         scanf("%d %d", &n, &m);
  79.         nodes = 2 * (n + m);
  80.         src = 0, sink = nodes, nd = 1;
  81.         k = n + m - 1;
  82.         mn = min(m, n);
  83.         int left[k], right[k];
  84.         for(i = 0; i < k; i++)
  85.             scanf("%d", &left[i]);
  86.         for(i = 0; i < k; i++)
  87.             scanf("%d", &right[i]);
  88.  
  89.         memset(rgraph, 0, sizeof(rgraph));
  90.         //start of making the nodes
  91.         for(i = 0, sub = 1; i < k; i++, nd++)
  92.         {
  93.             if((i+1) < mn)
  94.             {
  95.                 rgraph[src][nd] = left[i] - sub;
  96.                 sub++;
  97.             }
  98.             else if((i+1) >= mn && (n + m - (i+1)) >= mn)
  99.                 rgraph[src][nd] = left[i] - sub;
  100.             else
  101.             {
  102.                 --sub;
  103.                 rgraph[src][nd] = left[i] - sub;
  104.             }
  105.             r__g = rgraph[src][nd];
  106.         }
  107.         for(i = 0, sub = 1; i < k; i++, nd++)
  108.         {
  109.             if((i+1) < mn)
  110.             {
  111.                 rgraph[nd][sink] = right[i] - sub;
  112.                 sub++;
  113.             }
  114.             else if((i+1) >= mn && (n + m - (i+1)) >= mn)
  115.                 rgraph[nd][sink] = right[i] - sub;
  116.             else
  117.             {
  118.                 --sub;
  119.                 rgraph[nd][sink] = right[i] - sub;
  120.             }
  121.             r__g = rgraph[nd][sink];
  122.         }
  123.         //end of making the nodes
  124.  
  125.         makeEdge(n, m);
  126.         maxFlow();
  127.  
  128.         printf("Case %d:\n", kase);
  129.         for(i = 1; i <= n; i++)
  130.         {
  131.             for(j = 1; j <= m - 1; j++)
  132.             {
  133.                 u = i + j - 1;
  134.                 v = n + 2*m - 1 + i - j;
  135.                 printf("%d ", rgraph[v][u] + 1);
  136.             }
  137.             u = i + j - 1;
  138.             v = n + 2*m - 1 + i - j;
  139.             printf("%d", rgraph[v][u] + 1);
  140.             printf("\n");
  141.         }
  142.     }
  143.     return 0;
  144. }
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement