Sunday, April 21, 2019

[Toph] Ghosh vs Datta

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Ghosh vs Datta
Source            : Toph
Category          : Graph Theory, Maximum Flow
Algorithm         : Dinic Algorithm
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define inf                 1e6  
  6. #define pii                 pair <int, int>  
  7. #define ll                  long long  
  8.   
  9. static const int maxn = 100 + 5;  
  10.   
  11. struct Dinic  
  12. {  
  13.       int N;  
  14.       vector <int> graph[maxn];  
  15.       ll cap[maxn][maxn], flow[maxn][maxn];  
  16.       int level[maxn], ptr[maxn];  
  17.       Dinic(int n)  
  18.             : N(n)  
  19.             {  
  20.                   for (int i = 0; i < maxn; i++)  
  21.                   {  
  22.                         graph[i].clear();  
  23.                         level[i] = ptr[i] = 0;  
  24.                         for (int j = 0; j < maxn; j++) cap[i][j] = flow[i][j] = 0;  
  25.                   }  
  26.             }  
  27.   
  28.       void addEdge(int u, int v, ll w)  
  29.       {  
  30.             cap[u][v] = w;  
  31.             flow[u][v] = 0;  
  32.             graph[u].push_back(v);  
  33.             graph[v].push_back(u);  
  34.       }  
  35.       void updateEdge(int u, int v, ll w)  
  36.       {  
  37.             cap[u][v] = w;  
  38.             flow[u][v] = 0;  
  39.       }  
  40.       bool bfs(int src, int sink)  
  41.       {  
  42.             memset(level, -1, sizeof level);  
  43.             queue <int> PQ;  
  44.             PQ.emplace(src);  
  45.             level[src] = 0;  
  46.             while (!PQ.empty())  
  47.             {  
  48.                   int u = PQ.front(); PQ.pop();  
  49.                   for (int v : graph[u])  
  50.                   {  
  51.                         if (level[v] != -1 || flow[u][v] >= cap[u][v]) continue;  
  52.                         level[v] = level[u] + 1;  
  53.                         PQ.emplace(v);  
  54.                   }  
  55.             }  
  56.             return level[sink] != -1;  
  57.       }  
  58.       ll dfs(int u, ll minCap, int sink)  
  59.       {  
  60.             if (u == sink) return minCap;  
  61.             for (int &i = ptr[u]; i < int(graph[u].size()); i++)  
  62.             {  
  63.                   int v = graph[u][i];  
  64.                   if (level[v] == level[u] + 1 && flow[u][v] < cap[u][v])  
  65.                   {  
  66.                         ll minFlow = dfs(v, min(minCap, cap[u][v] - flow[u][v]), sink);  
  67.                         if (minFlow > 0)  
  68.                         {  
  69.                               flow[u][v] += minFlow;  
  70.                               flow[v][u] -= minFlow;  
  71.                               return minFlow;  
  72.                         }  
  73.                   }  
  74.             }  
  75.             return 0;  
  76.       }  
  77.       ll dinic(int src, int sink)  
  78.       {  
  79.             ll maxFlow = 0;  
  80.             while (bfs(src, sink))  
  81.             {  
  82.                   memset(ptr, 0, sizeof ptr);  
  83.                   while (ll bottleneck = dfs(src, inf, sink))  
  84.                         maxFlow += bottleneck;  
  85.             }  
  86.             return maxFlow;  
  87.       }  
  88.   
  89. };  
  90.   
  91. ll init_cap[maxn][maxn];  
  92.   
  93. int main()  
  94. {  
  95.       ios_base::sync_with_stdio(false);  
  96.       cin.tie(nullptr);  
  97.   
  98.       freopen("in.txt""r", stdin);  
  99.   
  100.       int tnode, tedge;  
  101.       cin >> tnode >> tedge;  
  102.   
  103.       Dinic PMG(tnode);  
  104.       Dinic TNT(tnode);  
  105.   
  106.       for (int e = 1; e <= tedge; e++)  
  107.       {  
  108.             int u, v;  
  109.             ll w;  
  110.             cin >> u >> v >> w;  
  111.             ++u, ++v;  
  112.             init_cap[u][v] = w;  
  113.             PMG.addEdge(u, v, w);  
  114.             TNT.addEdge(u, v, w);  
  115.       }  
  116.       int q;  
  117.       cin >> q;  
  118.       vector <pii> queries(q);  
  119.       for (pii &x : queries)  
  120.       {  
  121.             cin >> x.first >> x.second;  
  122.             ++x.first, ++x.second;  
  123.             PMG.updateEdge(x.first, x.second, 0);  
  124.             TNT.updateEdge(x.first, x.second, 0);  
  125.       }  
  126.       int pmg = 1;  
  127.       int tnt = tnode;  
  128.       ll pmg_tnt = 0, tnt_pmg = 0;  
  129.       vector <string> ans(q);  
  130.       for (int i = q - 1; i >= 0; i--)  
  131.       {  
  132.             pmg_tnt += PMG.dinic(pmg, tnt);  
  133.             tnt_pmg += TNT.dinic(tnt, pmg);  
  134.             if (pmg_tnt > tnt_pmg) ans[i] = "PMG";  
  135.             else if (tnt_pmg > pmg_tnt) ans[i] = "TNT";  
  136.             else if (tnt_pmg == 0 && tnt_pmg == 0) ans[i] = "Datta wins";  
  137.             else if (tnt_pmg > 0 && tnt_pmg == pmg_tnt) ans[i] = "Ghosh wins";  
  138.             int u = queries[i].first;  
  139.             int v = queries[i].second;  
  140.             PMG.updateEdge(u, v, init_cap[u][v]);  
  141.             TNT.updateEdge(u, v, init_cap[u][v]);  
  142.       }  
  143.       for (int i = 0; i < q; i++) cout << ans[i] << '\n';  
  144. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.