Guest User

Untitled

a guest
May 26th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <stdio.h>
  5. #include <deque>
  6.  
  7. using namespace std;
  8.  
  9. const int INF = (1 << 31) - 1;
  10.  
  11. struct Edge {
  12. int able;
  13. int cost;
  14. Edge* brother;
  15. int vert;
  16.  
  17. Edge(int able, int cost, int vert) {
  18. this -> able = able;
  19. this -> cost = cost;
  20. this -> vert = vert;
  21. }
  22. };
  23.  
  24. //vector<Edge*> graph[700];
  25.  
  26. int next[200000];
  27. int first[700];
  28. Edge* graph[200000];
  29.  
  30. int cnt;
  31.  
  32. int n, m;
  33.  
  34. int dist[700]; // Âåëè÷èíà êðàò÷àéøåãî ðàññòîÿíèÿ äî i-îé âåðøèíû.
  35. int from[700]; // Èç êàêîé âåðøèíû ïðèøëè â i-óþ âåðøèíû.
  36. Edge* fromEdge[700]; // Èç êàêîãî ðåáðà ïðèøëè.
  37. bool mark[700]; // Ïîìå÷åíà ëè âåðøèíà â àëãîðèòìå.
  38. int able[700]; //Ñêîëüêî íåôòè ìîæíî ïðîïóñòèòü èç èñòîêà â i-óþ âåðøèíó.
  39. int type[700];
  40.  
  41. deque<int> q;
  42.  
  43.  
  44. long long res;
  45.  
  46. int getMinVertex() {
  47. int res = -1;
  48. int curDist = INF;
  49. for (int i = 0; i < n + m + 2; i++) {
  50. if (dist[i] < curDist && !mark[i]) {
  51. res = i;
  52. curDist = dist[i];
  53. }
  54. }
  55. }
  56.  
  57. void relaxVertex(int vert) {
  58. mark[vert] = true;
  59. for (int i = first[vert]; i != -1; i = next[i]) {
  60. Edge* e = graph[i];
  61. if (e -> able > 0 && dist[e -> vert] > dist[vert] + e -> cost) {
  62. dist[e -> vert] = dist[vert] + e -> cost;
  63. from[e -> vert] = vert;
  64. fromEdge[e -> vert] = e;
  65. able[e -> vert] = min(e -> able, able[vert]);
  66. }
  67. }
  68. }
  69.  
  70. void initDijkstra() {
  71. for (int i = 0; i < n + m + 2; i++) {
  72. dist[i] = INF;
  73. mark[i] = false;
  74. able[i] = INF;
  75. type[i] = 0;
  76. }
  77. dist[0] = 0;
  78. }
  79.  
  80. bool runDijkstra() {
  81. initDijkstra();
  82. int vert;
  83. while ( (vert = getMinVertex()) != -1) {
  84. relaxVertex(vert);
  85. }
  86. return dist[1] != INF;
  87. }
  88.  
  89. void fillPath() {
  90. int cur = 1;
  91. long long sumCost = 0;
  92. while (cur != 0) {
  93. Edge* e = fromEdge[cur];
  94. sumCost += e -> cost;
  95. e -> able -= able[1];
  96. e -> brother -> able += able[1];
  97. cur = from[cur];
  98. }
  99. res += sumCost * able[1];
  100. }
  101.  
  102.  
  103. void addEdge(int from, int to, int cost, int able) {
  104. Edge* e = new Edge(able, cost, to);
  105. Edge* broth = new Edge(0, -cost, from);
  106. e -> brother = broth;
  107. broth -> brother = e;
  108. //graph[from].push_back(e);
  109. //graph[to].push_back(broth);
  110. next[cnt] = first[from];
  111. first[from] = cnt;
  112. graph[cnt++] = e;
  113. next[cnt] = first[to];
  114. first[to] = cnt;
  115. graph[cnt++] = broth;
  116.  
  117. }
  118.  
  119. void readData() {
  120. scanf("%d%d",&n, &m);
  121. for (int i = 0; i < n; i++) {
  122. int able;
  123. scanf("%d", &able);
  124. addEdge(0,i + 2, 0, able);
  125. }
  126. for (int i = 0; i < m; i++) {
  127. int able;
  128. scanf("%d", &able);
  129. addEdge(2 + n + i, 1, 0, able);
  130. }
  131. for (int i = 0; i < n; i++) {
  132. for (int j = 0; j < m; j++) {
  133. int cost;
  134. scanf("%d", &cost);
  135. addEdge(i + 2, j + n + 2, cost, INF);
  136. }
  137. }
  138. }
  139. //
  140. //void printGraph() {
  141. // for (int i = 0; i < n + m + 2; i++) {
  142. // printf("%d\n", i);
  143. // for (int j = 0; j < graph[i].size(); j++) {
  144. // Edge* e = graph[i][j];
  145. // printf("ver: %d, cost: %d, able: %d\n", e -> vert, e -> cost, e -> able);
  146. // }
  147. // printf("\n");
  148. // }
  149. //}
  150.  
  151.  
  152. int main() {
  153. freopen("input.txt", "r", stdin);
  154. freopen("output.txt", "w", stdout);
  155. memset(next, -1, sizeof (next));
  156. memset(first, -1, sizeof (first));
  157. readData();
  158. while (runDijkstra()) {
  159. fillPath();
  160. }
  161. cout << res << endl;
  162. //printGraph();
  163. fclose(stdout);
  164. return 0;
  165. }
Add Comment
Please, Sign In to add comment