Advertisement
Guest User

Untitled

a guest
Nov 1st, 2015
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define clr(x) memset((x), 0, sizeof(x))
  4. #define all(x) (x).begin(), (x).end()
  5. #define pb push_back
  6. #define mp make_pair
  7. #define in(x) int (x); input((x));
  8. #define x first
  9. #define y second
  10. #define fi first
  11. #define se second
  12. #define forn(i, n) for(int i = 0; i < (int)(n); ++i)
  13. #define ford(i, n) for(int i = (int)(n) - 1; i >= 0; --i)
  14. #define fore(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i)
  15. #define for1(i, n) for(int i = 1; i <= (int)(n); ++i)
  16.  
  17.  
  18. typedef int itn;
  19.  
  20. #define next next12345
  21. #define prev prev12345
  22. #define left lefdsf232
  23. #define right rig43783
  24. #define x1 x12345
  25. #define y1 y12345
  26.  
  27. using namespace std;
  28.  
  29. template<typename T>
  30. T gcd(T x, T y) {
  31.     while (y > 0) {
  32.         x %= y;
  33.         swap(x, y);
  34.     }
  35.     return x;
  36. }
  37.  
  38. template<class _T>
  39. inline _T sqr(const _T &x) {
  40.     return x * x;
  41. }
  42.  
  43. template<class _T>
  44. inline string tostr(const _T &a) {
  45.     ostringstream os("");
  46.     os << a;
  47.     return os.str();
  48. }
  49.  
  50. typedef long double ld;
  51. typedef long long ll;
  52. typedef long long i64;
  53. typedef unsigned long long ull;
  54. typedef unsigned long long u64;
  55. typedef pair<int, int> PII;
  56. typedef pair<int, int> pii;
  57. const long double PI = 3.1415926535897932384626433832795L;
  58.  
  59. template<typename T>
  60. inline void input(T &a) {
  61.     static int ed;
  62.     a = 0;
  63.     while (!isdigit(ed = getchar()) && ed != '-') { }
  64.     char neg = 0;
  65.     if (ed == '-') {
  66.         neg = 1;
  67.         ed = getchar();
  68.     }
  69.     while (isdigit(ed)) {
  70.         a = 10 * a + ed - '0';
  71.         ed = getchar();
  72.     }
  73.     if (neg) a = -a;
  74. }
  75.  
  76. template<typename T = int>
  77. inline T nxt() {
  78.     T res;
  79.     input(res);
  80.     return res;
  81. }
  82. long long mod = 1000000007;
  83.  
  84. long long pw(long long a, long long n) {
  85.     long long res = 1;
  86.     while (n) {
  87.         if (n & 1ll) {
  88.             res = res * a % mod;
  89.         }
  90.         a = a * a % mod;
  91.         n >>= 1;
  92.     }
  93.     return res;
  94. }
  95.  
  96. long long inv(long long a) {
  97.     return pw(a, mod - 2);
  98. }
  99.  
  100.  
  101. struct Edge {
  102.     int fr, to, cap, cost, fl;
  103.     Edge() {}
  104.     Edge(int fr, int to, int cap, int co) : fr(fr), to(to), cap(cap), cost(co), fl(0) {}
  105. };
  106.  
  107. vector<Edge> e;
  108. const int N = 50;
  109. vector<int> g[N];
  110. int V;
  111.  
  112. void addEdge(int f, int t, int c, int cost) {
  113.     g[f].push_back(e.size());
  114.     e.push_back(Edge(f, t, c, cost));
  115.     g[t].push_back(e.size());
  116.     e.push_back(Edge(t, f, 0, -cost));
  117. }
  118.  
  119. int u[N];
  120. int q[N];
  121. int d[N];
  122. int p[N];
  123.  
  124. bool fb(int s, int t) {
  125.     memset(d, 0x3f, V * sizeof(int));
  126.     memset(u, 0, V * sizeof(int));
  127.     memset(p, -1, V * sizeof(int));
  128.     int q1 = 0, q2 = 0;
  129.     q[q2++] = s;
  130.     u[s] = 1;
  131.     d[s] = 0;
  132.  
  133.     while (q1 != q2) {
  134.         int v = q[q1++];
  135.         u[v] = 0;
  136.         if (q1 == V) {
  137.             q1 = 0;
  138.         }
  139.         for (int eid : g[v]) {
  140.             if (e[eid].cap - e[eid].fl <= 0)
  141.                 continue;
  142.             int to = e[eid].to;
  143.             int len = e[eid].cost;
  144.             if (d[to] > d[v] + len) {
  145.                 d[to] = d[v] + len;
  146.                 p[to] = eid;
  147.                 if (!u[to]) {
  148.                     u[to] = 1;
  149.                     q[q2++] = to;
  150.                     if (q2 == V)
  151.                         q2 = 0;
  152.                 }
  153.             }
  154.         }
  155.     }
  156.     return p[t] != -1;
  157. }
  158.  
  159. int flow, cost;
  160.  
  161. void pushFlow(int s, int t) {
  162.     flow += 1;
  163.     cost += d[t];
  164.     int v = t;
  165.     while (v != s) {
  166.         e[p[v]].fl += 1;
  167.         e[p[v] ^ 1].fl -= 1;
  168.         v = e[p[v]].fr;
  169.     }
  170. }
  171.  
  172. void minCostMaxFlow(int s, int t) {
  173.     flow = 0;
  174.     cost = 0;
  175.     while (fb(s, t)) {
  176.         pushFlow(s, t);
  177.     }
  178. }
  179.  
  180. void clearFlow() {
  181.     for (int i = 0; i < e.size(); ++i) {
  182.         e[i].fl = 0;
  183.     }
  184. }
  185.  
  186. void solve() {
  187.     int n = nxt();
  188.     int k = nxt();
  189.     int c = nxt();
  190.     int m = nxt();
  191.     V = n + k + 2;
  192.     int S = V - 2;
  193.     int T = V - 1;
  194.  
  195.     int qs[m];
  196.     int qt[m];
  197.     int qw[m];
  198.  
  199.     for (int i = 0; i < m; ++i) {
  200.         qs[i] = nxt() - 1;
  201.         qt[i] = nxt() - 1;
  202.         qw[i] = nxt();
  203.     }
  204.     for (int i = 0; i < m; ++i) {
  205.         addEdge(qt[i], k + qs[i], 1, 0);
  206.     }
  207.     for (int i = 0; i < k; ++i) {
  208.         addEdge(S, i, 0, 0);
  209.     }
  210.     for (int i = 0; i < n; ++i) {
  211.         addEdge(k + i, T, 1, 0);
  212.     }
  213.  
  214.     int Q = nxt();
  215.  
  216.  
  217.     int dp[Q + 1];
  218.     memset(dp, 0x3f, sizeof(dp));
  219.     dp[0] = 0;
  220.     int A[Q][k];
  221.     int mask[Q];
  222.     clr(mask);
  223.     for (int i = 0; i < Q; ++i) {
  224.         for (int j = 0; j < k; ++j) {
  225.             A[i][j] = nxt();
  226.             if (A[i][j] > 0) {
  227.                 mask[i] |= (1 << j);
  228.             }
  229.         }
  230.     }
  231.  
  232.     for (int i = 0; i < Q; ++i) {
  233.         int cm = 0;
  234.         int AA[k];
  235.         clr(AA);
  236.         for (int r = i; r < Q; ++r) {
  237.             cm |= mask[r];
  238.             for (int j = 0; j < k; ++j) {
  239.                 AA[j] += A[r][j];
  240.             }
  241.             clearFlow();
  242.             for (int j = 0; j < m; ++j) {
  243.                 e[2 * j].cost = AA[qt[j]] * qw[j];
  244.                 e[2 * j + 1].cost = -AA[qt[j]] * qw[j];
  245.             }
  246.             for (int j = 0; j < k; ++j) {
  247.                 if (cm & (1 << j)) {
  248.                     e[2 * m + 2 * j].cap = 1;
  249.                 } else {
  250.                     e[2 * m + 2 * j].cap = 0;
  251.                 }
  252.             }
  253.             int needFlow = __builtin_popcount(cm);
  254.             minCostMaxFlow(S, T);
  255.             if (flow != needFlow) {
  256.                 break;
  257.             }
  258.             dp[r + 1] = min(dp[r + 1], dp[i] + c + cost);
  259.         }
  260.     }
  261.     cout << dp[Q] << "\n";
  262. }
  263.  
  264. int main() {
  265.     //#define int long
  266. #ifdef LOCAL
  267.     freopen("input.txt", "r", stdin);
  268.     //freopen("output.txt", "w", stdout);
  269. #else
  270. #define fname "race"
  271.     //freopen(fname".in", "r", stdin);
  272.     //freopen(fname".out", "w", stdout);
  273. #endif
  274.  
  275.     solve();
  276.    
  277. #ifdef LOCAL
  278.     cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl;
  279. #endif
  280.     return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement