Advertisement
RaFiN_

1100E - Andrew and Taxi cf-1100E

Jul 6th, 2020
1,839
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 5 ;
  5.  
  6. typedef long long ll;
  7.  
  8. struct Edge {
  9.     int u, v, w;
  10. }E[N];
  11.  
  12. int n, m;
  13. vector<int> G[N];
  14. int vis[N];
  15.  
  16. bool cycle;
  17.  
  18. void dfs(int u) {
  19.     vis[u] = 1;
  20.     for(int v : G[u]) {
  21.         if (vis[v] == 0) {
  22.             dfs(v);
  23.         }
  24.         else if (vis[v] == 1) {
  25.             cycle = true;
  26.             return;
  27.         }
  28.     }
  29.     vis[u] = 2;
  30. }
  31.  
  32. bool ok(int lim) {
  33.     for(int i = 1; i <= n; i++) G[i].clear();
  34.     for(int i = 1; i <= m; i++) {
  35.         if (E[i].w > lim) {
  36.             G[E[i].u].push_back(E[i].v);
  37.         }
  38.     }
  39.     cycle = false;
  40.     memset(vis,0,sizeof vis);
  41.     for(int i = 1; i <= n; i++) {
  42.         if (vis[i] == 0) {
  43.             dfs(i);
  44.         }
  45.     }
  46.     return !cycle;
  47. }
  48.  
  49. vector<int> sorted;
  50. int ord[N];
  51.  
  52. void topSort(int u) {
  53.     vis[u] = 1;
  54.     for(int v : G[u]) {
  55.         if (vis[v]==0) {
  56.             topSort(v);
  57.         }
  58.     }
  59.     sorted.push_back(u);
  60.     ord[u] = (int)sorted.size();
  61. }
  62.  
  63. void F(int lim) {
  64.     for(int i = 1; i <= n; i++) G[i].clear();
  65.     for(int i = 1; i <= m; i++) {
  66.         if (E[i].w > lim) {
  67.             G[E[i].u].push_back(E[i].v);
  68.         }
  69.     }
  70.     memset(vis,0,sizeof vis);
  71.     for(int i = 1; i <= n; i++) {
  72.         if (vis[i]==0) topSort(i);
  73.     }
  74.     vector <int> change;
  75.     for(int i = 1; i <= m ; i++) {
  76.         if (E[i].w <= lim) {
  77.             int u = E[i].u , v = E[i].v;
  78.             if (ord[u] < ord[v]) {
  79.                 change.push_back(i);
  80.             }
  81.         }
  82.     }
  83.     cout << lim << " " << (int)change.size() << endl ;
  84.     for(int x : change) printf ("%d " , x);
  85. }
  86.  
  87.  
  88. int main() {
  89.     cin >> n >> m ;
  90.     for(int i = 1; i <= m; i++) {
  91.         scanf("%d %d %d",&E[i].u,&E[i].v,&E[i].w);
  92.     }
  93.     int lo = 0, hi = 1e9 + 10;
  94.     while(hi > lo) {
  95.         int mid = (hi+lo)/2;
  96.         if(ok(mid)) hi = mid;
  97.         else lo = mid+1;
  98.     }
  99.     F(lo);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement