Advertisement
lukadupli

Traffic CEOI11

Nov 17th, 2022
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN = 3e5 + 5, MAXM = 9e5 + 5, INF = 0x3f3f3f3f;
  6.  
  7. int n, m, A, B;
  8.  
  9. vector<int> adj1[MAXN], adj2[MAXN];
  10.  
  11. vector<pair<int, int>> lt_list, lt_sort;
  12.  
  13. vector<pair<int, int>> rt_sort, rt_list;
  14. int rt_code[MAXN];
  15.  
  16. bool bio[MAXN], erased[MAXN];
  17.  
  18. int scc[MAXN];
  19. set<int> scc_adj[MAXN];
  20.  
  21. void dfs4erasing(int node){
  22. bio[node] = true;
  23.  
  24. for(int nxt : adj1[node]){
  25. if(!bio[nxt]) dfs4erasing(nxt);
  26. }
  27. }
  28.  
  29. vector<int> scc_stack;
  30. void scc_dfs1(int node){
  31. bio[node] = true;
  32.  
  33. for(int nxt : adj1[node]){
  34. if(!bio[nxt] && !erased[nxt]) scc_dfs1(nxt);
  35. }
  36.  
  37. scc_stack.push_back(node);
  38. }
  39.  
  40. void scc_dfs2(int node, int comp){
  41. bio[node] = true;
  42. scc[node] = comp;
  43.  
  44. for(int nxt : adj2[node]){
  45. if(erased[nxt]) continue;
  46.  
  47. if(!bio[nxt]) scc_dfs2(nxt, comp);
  48. }
  49. }
  50.  
  51. int mini[MAXN], maxi[MAXN];
  52. void minmax_dfs(int scomp){
  53. bio[scomp] = true;
  54.  
  55. for(int nxt : scc_adj[scomp]){
  56. if(!bio[nxt]) minmax_dfs(nxt);
  57.  
  58. mini[scomp] = min(mini[scomp], mini[nxt]);
  59. maxi[scomp] = max(maxi[scomp], maxi[nxt]);
  60. }
  61. }
  62.  
  63. int main(){
  64. // input
  65.  
  66. cin >> n >> m >> A >> B;
  67.  
  68. for(int i = 1; i <= n; i++){
  69. int x, y;
  70. cin >> x >> y;
  71.  
  72. if(x == 0) lt_list.push_back({y, i});
  73. else if(x == A) rt_list.push_back({y, i});
  74. }
  75.  
  76. for(int i = 0; i < m; i++){
  77. int a, b, k;
  78. cin >> a >> b >> k;
  79.  
  80. if(k == 1){
  81. adj1[a].push_back(b);
  82. adj2[b].push_back(a);
  83. }
  84. else{
  85. adj1[a].push_back(b);
  86. adj1[b].push_back(a);
  87.  
  88. adj2[a].push_back(b);
  89. adj2[b].push_back(a);
  90. }
  91. }
  92.  
  93. // erasing
  94. for(auto par : lt_list) dfs4erasing(par.second);
  95.  
  96. for(auto par : rt_list){
  97. if(!bio[par.second]) erased[par.second] = true;
  98. }
  99.  
  100. // setting up rt_code
  101.  
  102. for(auto par : rt_list){
  103. if(!erased[par.second]) rt_sort.push_back(par);
  104. }
  105.  
  106. sort(rt_sort.begin(), rt_sort.end());
  107.  
  108. for(int i = 0; i < rt_sort.size(); i++) rt_code[rt_sort[i].second] = i + 1;
  109.  
  110. // scc
  111. memset(bio, 0, sizeof bio);
  112.  
  113. for(int node = 1; node <= n; node++){
  114. if(!bio[node] && !erased[node]) scc_dfs1(node);
  115. }
  116.  
  117. reverse(scc_stack.begin(), scc_stack.end());
  118. memset(bio, 0, sizeof bio);
  119.  
  120. int comp = 1;
  121. for(int node : scc_stack){
  122. if(!bio[node]){
  123. scc_dfs2(node, comp);
  124. comp++;
  125. }
  126. }
  127.  
  128. // scc_adj i mini-maxi start
  129. memset(mini, INF, sizeof mini);
  130. memset(maxi, -1, sizeof maxi);
  131.  
  132. for(int node = 1; node <= n; node++){
  133. if(rt_code[node]){
  134. mini[scc[node]] = min(mini[scc[node]], rt_code[node]);
  135. maxi[scc[node]] = max(maxi[scc[node]], rt_code[node]);
  136. }
  137.  
  138. for(auto neigh : adj1[node]){
  139. if(scc[node] != scc[neigh]) scc_adj[scc[node]].insert(scc[neigh]);
  140. }
  141. }
  142.  
  143. //dfs po scc-ovima
  144. memset(bio, 0, sizeof bio);
  145. for(int scomp = 1; scomp < comp; scomp++){
  146. if(!bio[scomp]) minmax_dfs(scomp);
  147. }
  148.  
  149. //rjesenje
  150. for(auto par : lt_list){
  151. if(!erased[par.second]) lt_sort.push_back(par);
  152. }
  153.  
  154. sort(lt_sort.begin(), lt_sort.end(), [](pair<int, int> a, pair<int, int> b){return a > b;});
  155.  
  156. for(auto par : lt_sort){
  157. int node = par.second;
  158.  
  159. if(maxi[scc[node]] == -1) cout << "0\n";
  160. else cout << maxi[scc[node]] - mini[scc[node]] + 1 << '\n';
  161. }
  162.  
  163. // print
  164. /*
  165. for(int i = 1; i <= n; i++){
  166. cout << i << ": ";
  167. if(erased[i]) cout << "erased\n";
  168. else cout << "component " << scc[i] << '\n';
  169. }
  170. cout << '\n';
  171.  
  172. for(int i = 1; i < comp; i++){
  173. cout << "Adjacent components to component " << i << ":\n\t";
  174.  
  175. for(auto e : scc_adj[i]) cout << e << ' ';
  176. cout << '\n';
  177. }
  178. cout << '\n';
  179.  
  180. for(int i = 1; i < comp; i++){
  181. cout << "Component " << i << ", mini: " << mini[i] << ", maxi: " << maxi[i] << '\n';
  182. }
  183. */
  184.  
  185. return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement