Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. struct Edge {
  9. int from, to;
  10. long long w;
  11.  
  12. Edge() {}
  13.  
  14. Edge(int from, int to, long long w) : from(from), to(to), w(w) {}
  15. };
  16.  
  17. int n, m;
  18. int *colors;
  19. bool *used;
  20. vector<vector<Edge>> g;
  21. vector<vector<Edge>> reversedG;
  22. vector<Edge> edges;
  23. stack<int> orderStack;
  24. long long *sum;
  25.  
  26. const int PRECOUNT_MAX = 15000;
  27.  
  28. void dfs(int v) {
  29. used[v] = true;
  30. for (Edge e : g[v]) {
  31. if (!used[e.to])
  32. dfs(e.to);
  33. }
  34. orderStack.push(v);
  35. }
  36.  
  37.  
  38. void dfs2(int v, int curColor) {
  39. colors[v] = curColor;
  40. for (Edge e : reversedG[v]) {
  41. if (colors[e.to] == -1)
  42. dfs2(e.to, curColor);
  43. }
  44. }
  45.  
  46. vector<vector<Edge>> newG;
  47.  
  48. void dfs3(int v) {
  49. used[v] = true;
  50. for (Edge e : g[v]) {
  51. if (colors[v] != colors[e.to]) {
  52. Edge e2(colors[v], colors[e.to], e.w);
  53. newG[colors[v]].push_back(e2);
  54. }
  55. if (!used[e.to])
  56. dfs3(e.to);
  57. }
  58. }
  59.  
  60.  
  61. long long *compWeight;
  62. long long *ans;
  63.  
  64.  
  65. long long getSum(long long w) {
  66. if (w == 0)
  67. return 0;
  68. int ans = ((int) sqrt(2 * w)) - 1;
  69. if ((ans + 1) * (ans + 2) / 2 <= w)
  70. ans++;
  71. if ((ans + 1) * (ans + 2) / 2 <= w)
  72. ans++;
  73.  
  74. return w * (ans + 1) - sum[ans];
  75. }
  76.  
  77. bool *usedComps;
  78.  
  79. long long dfs4(int v) {
  80. if (ans[v] == -1LL) {
  81. if (newG[v].empty()) {
  82. ans[v] = compWeight[v];
  83. return ans[v];
  84. } else {
  85. long long max2 = 0;
  86. for (Edge e : newG[v]) {
  87. max2 = max(max2, e.w + dfs4(e.to));
  88. }
  89. ans[v] = max2 + compWeight[v];
  90. return ans[v];
  91. }
  92. } else
  93. return ans[v];
  94. }
  95.  
  96. int main() {
  97. ios_base::sync_with_stdio(false);
  98. cin >> n >> m;
  99. colors = new int[n];
  100. used = new bool[n];
  101. sum = new long long[PRECOUNT_MAX];
  102. g.reserve(n);
  103. reversedG.reserve(n);
  104. edges.reserve(m);
  105. for (int i = 0; i < n; i++) {
  106. vector<Edge> g2;
  107. vector<Edge> reversedG2;
  108. g.push_back(g2);
  109. reversedG.push_back(reversedG2);
  110. }
  111. for (int i = 0; i < m; i++) {
  112. Edge e1;
  113. Edge e2;
  114. cin >> e1.from;
  115. cin >> e1.to;
  116. cin >> e1.w;
  117. e1.from--;
  118. e1.to--;
  119. e2.to = e1.from;
  120. e2.from = e1.to;
  121. e2.w = e1.w;
  122. g[e1.from].push_back(e1);
  123. reversedG[e2.from].push_back(e2);
  124. edges.push_back(e1);
  125. }
  126. sum[0] = 0;
  127. sum[1] = 1;
  128. long long cur = 1;
  129. for (int i = 2; i < PRECOUNT_MAX; i++) {
  130. cur = cur + (long long) i;
  131. sum[i] = sum[i - 1] + cur;
  132. }
  133. int start;
  134. cin >> start;
  135. start--;
  136. for (int i = 0; i < n; i++) {
  137. used[i] = false;
  138. colors[i] = -1;
  139. }
  140. for (int i = 0; i < n; i++)
  141. if (!used[i])
  142. dfs(i);
  143. int color = 0;
  144. while (!orderStack.empty()) {
  145. int curV = orderStack.top();
  146. orderStack.pop();
  147. if (colors[curV] == -1)
  148. dfs2(curV, color++);
  149. }
  150. newG.reserve(color);
  151. for (int i = 0; i < color; i++) {
  152. vector<Edge> newG2;
  153. newG.push_back(newG2);
  154. }
  155. for (int i = 0; i < n; i++) {
  156. used[i] = false;
  157. }
  158. for (int i = 0; i < n; i++) {
  159. if (!used[i])
  160. dfs3(i);
  161. }
  162. compWeight = new long long[color];
  163. ans = new long long[color];
  164. for (int i = 0; i < color; i++) {
  165. compWeight[i] = 0LL;
  166. ans[i] = -1LL;
  167. }
  168. for (Edge e : edges) {
  169. if (colors[e.from] == colors[e.to]) {
  170. compWeight[colors[e.from]] += getSum(e.w);
  171. }
  172. }
  173. usedComps = new bool[color];
  174. for (int i = 0; i < color; i++) {
  175. usedComps[i] = false;
  176. }
  177. cout << dfs4(colors[start]);
  178. return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement