Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #pragma GCC optimize ("O3")
  2. #pragma GCC target ("sse4")
  3.  
  4. #include <bits/stdc++.h>
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <ext/pb_ds/tree_policy.hpp>
  7.  
  8. using namespace std;
  9. template <class T>
  10. using ordered_set = __gnu_pbds::tree<T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
  11. template <class T>
  12. using ordered_multiset = __gnu_pbds::tree<T, __gnu_pbds::null_type, less_equal<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
  13.  
  14. #define PI atan2(0, -1)
  15. #define epsilon 1e-9
  16. #define INF 5e18
  17. #define MOD 1000000007
  18.  
  19. #define mp make_pair
  20. #define pb push_back
  21. #define f first
  22. #define s second
  23. #define lb lower_bound
  24. #define ub upper_bound
  25.  
  26. struct Edge{
  27. long long v, flow, C, rev;
  28. };
  29.  
  30. struct Dinic {
  31. long long level [2050], start [2050], cache [2050];
  32. vector<Edge> adj [2050];
  33. void addEdge(int u, int v, long long C){
  34. Edge a{v, 0, C, (long long)adj[v].size()};
  35. Edge b{u, 0, 0, (long long)adj[u].size()};
  36. adj[u].pb(a); adj[v].pb(b);
  37. }
  38. bool BFS(int s, int t){
  39. for(int i = 0; i < 2050; i++) level[i] = -1;
  40. queue<int> q; level[s] = 0; q.push(s);
  41. while(!q.empty()){
  42. int u = q.front(); q.pop();
  43. for(auto e: adj[u])
  44. if(level[e.v] < 0 && e.flow < e.C){
  45. level[e.v] = level[u]+1;
  46. q.push(e.v);
  47. }
  48. }
  49. return level[t] != -1;
  50. }
  51. long long sendFlow(int u, long long flow, int t){
  52. if(u == t) return flow;
  53. for( ; start[u] < adj[u].size(); start[u] ++){
  54. Edge &e = adj[u][start[u]];
  55. if(level[e.v] == level[u]+1 && e.flow < e.C){
  56. long long curr_flow = min(flow, e.C-e.flow);
  57. long long temp_flow = sendFlow(e.v, curr_flow, t);
  58. if(temp_flow > 0){
  59. e.flow += temp_flow;
  60. adj[e.v][e.rev].flow -= temp_flow;
  61. return temp_flow;
  62. }
  63. }
  64. }
  65. return 0;
  66. }
  67. long long flowIt(int s, int t){
  68. if(s == t) return -1;
  69. long long total = 0;
  70. while(BFS(s, t)){
  71. for(int i = 0; i < 2050; i++) start[i] = 0;
  72. while (long long flow = sendFlow(s, INF, t)) total += flow;
  73. }
  74. return total;
  75. }
  76. };
  77.  
  78. int N, M, processed = 0, indeg [510];
  79. vector<int> adjacency [510];
  80. bool linked [510][510];
  81. queue<int> q;
  82. Dinic solver;
  83.  
  84. int main(){
  85. //freopen("sort.in", "r", stdin); freopen("sort.out", "w", stdout);
  86. ios_base::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(10);
  87. cin >> N >> M;
  88. for(int i = 0; i < M; i++){
  89. int a, b; cin >> a >> b;
  90. adjacency[a].pb(b); indeg[b]++;
  91. linked[a][b] = 1;
  92. }
  93. for(int k = 0; k < N; k++)
  94. for(int a = 0; a < N; a++)
  95. for(int b = 0; b < N; b++)
  96. linked[a][b] |= linked[a][k]&linked[k][b];
  97. for(int i = 0; i < N; i++)
  98. if(indeg[i] == 0)
  99. q.push(i);
  100. while(q.size() > 0){
  101. int curr = q.front(); q.pop();
  102. processed++;
  103. for(int nexty : adjacency[curr])
  104. if(--indeg[nexty] == 0)
  105. q.push(nexty);
  106. }
  107. for(int i = 0; i < N; i++)
  108. if(indeg[i])
  109. for(int j = 0; j < N; j++)
  110. linked[i][j] = linked[j][i] = 0;
  111. for(int i = 0; i < N; i++){
  112. solver.addEdge(1000, i, 1), solver.addEdge(i+N, 1001, 1);
  113. for(int j = 0; j < N; j++)
  114. if(linked[i][j])
  115. solver.addEdge(i, j+N, 1);
  116. }
  117. cout << processed-solver.flowIt(1000, 1001) << '\n';
  118. return 0;
  119. }
  120.  
  121. /******************************
  122. Kateba ii dake no hanashi darou
  123. Success is only a victory away
  124. - No Game No Life Opening
  125. ******************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement