Advertisement
BotByte

testtest.cpp

Apr 24th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. /*
  2.     Algorithm : Dinic's Algorithm For Max Flow
  3.     0-indexed node numbering(0, 1, 2, ..., n-1)
  4.     s - source node
  5.     t - destination node
  6. */
  7.  
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. const int MAXN = 100000;
  13. const int INF = 1000000000;
  14.  
  15. struct edge {
  16.     int a, b, cap, flow;
  17. };
  18. int cnt[27], letter;
  19. int n, s, t, d[MAXN], ptr[MAXN], q[MAXN];
  20. vector<edge> e;
  21. vector<int> g[MAXN];
  22.  
  23. void add_edge(int u, int v, int cap)
  24. {
  25.     edge e1 = {u, v, cap, 0};
  26.     edge e2 = {v, u, 0, 0};
  27.     g[u].push_back((int)e.size());
  28.     e.push_back(e1);
  29.     g[v].push_back((int)e.size());
  30.     e.push_back(e2);
  31. }
  32.  
  33. bool bfs()
  34. {
  35.     int qh = 0, qt = 0;
  36.     q[qt++] = s;
  37.     memset (d, -1, n * sizeof d[0]);
  38.     d[s] = 0;
  39.     while(qh < qt && d[t] == -1){
  40.         int v = q[qh++];
  41.         for(size_t i =0; i<g[v].size(); ++i){
  42.             int id = g[v][i], to = e[id].b;
  43.             if(d[to] == -1 && e[id].flow < e[id].cap){
  44.                 q[qt++] = to;
  45.                 d[to] = d[v] + 1;
  46.             }
  47.         }
  48.     }
  49.     return d[t] != -1;
  50. }
  51.  
  52. int dfs(int v, int flow)
  53. {
  54.     if(!flow) return 0;
  55.     if(v == t) return flow;
  56.     for(; ptr[v] < (int)g[v].size(); ++ptr[v]){
  57.         int id = g[v][ptr[v]], to = e[id].b;
  58.         if(d[to] != d[v]+1) continue;
  59.         int pushed = dfs(to, min(flow, e[id].cap - e[id].flow));
  60.         if(pushed){
  61.             e[id].flow += pushed;
  62.             e[id^1].flow -= pushed;
  63.             return pushed;
  64.         }
  65.     }
  66.     return 0;
  67. }
  68.  
  69. int dinic()
  70. {
  71.     int flow = 0;
  72.     for(;;){
  73.         if(!bfs()) break;
  74.         memset(ptr, 0, n*sizeof ptr[0]);
  75.         while(int pushed = dfs(s, INF)){
  76.             flow += pushed;
  77.         }
  78.     }
  79.     return flow;
  80. }
  81.  
  82. void prep()
  83. {
  84.     for(int i=0; i<MAXN; i++){
  85.         g[i].clear();
  86.     }
  87.     e.clear();
  88. }
  89.  
  90. void build(int st)
  91. {
  92.     s = 0, t = 26 + letter + 1;
  93.     n = t+1;
  94.     for(int i=1; i<=26; i++){
  95.         add_edge(s, i, cnt[i]);
  96.     }
  97.     for(int i=st; i<=letter; i++){
  98.         int nodeNum = i+26;
  99.         add_edge(nodeNum, t, 1);
  100.         for(int j=1; j<=26; j++){
  101.             if(i%j == 0 && cnt[j]){
  102.                 add_edge(j, nodeNum, 1);
  103.             }
  104.         }
  105.     }
  106. }
  107.  
  108. int main()
  109. {
  110.     int cases;
  111.     scanf("%d", &cases);
  112.     while(cases--){
  113.         scanf("%d", &letter);
  114.         for(int i=1; i<=26; i++){
  115.             scanf("%d", &cnt[i]);
  116.         }
  117.         int ans[letter];
  118.         prep();
  119.         build(1);
  120.         if(dinic() == letter){
  121.             for(int i=1; i<=letter; i++){
  122.                 for(int j=1; j<=26; j++){
  123.                     if(cnt[j]){
  124.                         if(i % j == 0){
  125.  
  126.                         }
  127.                     }
  128.                 }
  129.             }
  130.         }
  131.     }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement