Advertisement
Guest User

Reverse the Graphs - CRANREVG - Cranium 2015

a guest
Feb 14th, 2015
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. /*  Sanchit Abrol  */
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(X) (X).begin(),(X).end()
  8. #define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
  9. #define s(a) scanf("%d", &a)
  10. #define INF (1LL<<60)
  11.  
  12. const int MAXN = 210;
  13. int N,i,j,T,in[MAXN],out[MAXN],S;
  14. bool vis[MAXN];
  15. long long G[MAXN][MAXN],flow[MAXN],prevn[MAXN];
  16. long long maxflow(int source, int sink);
  17. void dfs(int v);
  18. vector<vector<int> > edges;
  19.  
  20. int main()
  21. {
  22.     s(N);
  23.     int ind = 0, outd = 0;
  24.     for(i = 0; i < N; i++)
  25.     {
  26.         s(out[i]); outd += out[i];
  27.         s(in[i]);  ind += in[i];
  28.     }
  29.     if(outd != ind)
  30.     {
  31.         printf("Not possible\n");
  32.         return 0;
  33.     }    
  34.     for(i = 0; i < N; i++)
  35.     {
  36.         if(out[i])
  37.         {
  38.             for(j = 0; j < N; j++)            
  39.                 if(in[j] && i != j)        
  40.                     G[i + 1][j + N + 1] = 1;
  41.         }
  42.     }    
  43.     S = 2*N + 1;
  44.     T = 2*N + 2;
  45.     for(i = 0; i < N; i++)
  46.     {
  47.         G[S][i + 1] = out[i];
  48.         G[i + N + 1][T] = in[i];        
  49.     }
  50.     long long x = maxflow(S, T);
  51.     if(x != ind)
  52.     {        
  53.         printf("Not possible\n");
  54.         return 0;
  55.     }    
  56.     edges.resize(N + 2);
  57.     for(i = 1; i <= N; i++)
  58.     for(j = N+1; j <= 2*N; j++)
  59.         if(G[j][i] > 0)
  60.             edges[i].pb(j-N);
  61.     for(i = 1; i <= N; i++)
  62.     {
  63.         printf("%d ", (int)edges[i].size());
  64.         for(auto x : edges[i])
  65.             printf("%d ", x);
  66.         printf("\n");
  67.     }          
  68.    
  69.     return 0;
  70. }
  71.  
  72. void dfs(int v)
  73. {
  74.     vis[v] = true;
  75.     for(int i=1;i<=2*N+2;i++)
  76.         if(G[v][i] > 0 && !vis[i])
  77.             dfs(i);
  78. }
  79.  
  80. long long maxflow(int source, int sink)
  81. {
  82.     if(source == sink)
  83.         return INF;
  84.  
  85.     long long total_flow = 0, mx_flow = 0;
  86.     int mx_idx = -1;
  87.     while(1)
  88.     {
  89.         memset(flow,0,sizeof flow);
  90.         memset(prevn,0,sizeof prevn);
  91.         memset(vis,0,sizeof vis);
  92.         flow[source] = INF;
  93.  
  94.         while(1)
  95.         {
  96.             mx_flow = 0;
  97.             mx_idx = -1;
  98.             for(int i=1; i<=2*N+2; i++)
  99.             if(flow[i] > mx_flow && !vis[i])
  100.             {
  101.                 mx_flow = flow[i];
  102.                 mx_idx = i;
  103.             }
  104.             if(mx_idx == -1 || mx_idx == sink)
  105.                 break;
  106.  
  107.             vis[mx_idx] = 1;
  108.             for(int i=1; i<=2*N+2; i++)
  109.             if(flow[i] < min(mx_flow,G[mx_idx][i]))
  110.             {
  111.                 prevn[i] = mx_idx;
  112.                 flow[i] = min(mx_flow,G[mx_idx][i]);
  113.             }
  114.         }
  115.         if(mx_idx == -1) break;
  116.  
  117.         total_flow += flow[sink];
  118.  
  119.         int cur = sink;
  120.         while(cur != source)
  121.         {
  122.             int next = prevn[cur];
  123.             G[next][cur] -= flow[sink];
  124.             G[cur][next] += flow[sink];
  125.             cur = next;
  126.         }
  127.     }
  128.     return total_flow;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement