Guest User

Untitled

a guest
Nov 13th, 2022
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define speed ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  6. #define pb push_back
  7. #define mp make_pair
  8. #define ppb pop_back
  9. #define F first
  10. #define S second
  11. #define sz(x) (int)(x.size())
  12. #define all(x) x.begin(), x.end()
  13. #define rall(x) x.rbegin(), x.rend()
  14. #define gcd __gcd
  15. #define sqrt sqrtl
  16. #define nl '\n'
  17.  
  18. typedef long long ll;
  19. typedef unsigned long long ull;
  20. typedef long double ld;
  21. typedef pair <int, int> pii;
  22.  
  23. const int N = 1e5+5;
  24. const ll INF = (ll)1e16;
  25. const int inf = INT_MAX;
  26. const int mod = 1e9+9;
  27. const double EPS = 1e-9;
  28. const int P = 71;
  29.  
  30. struct node{
  31.     int u, v, w;
  32. };
  33.  
  34. int n, m, d, mx = -inf, par[N];
  35. vector <vector <int> > g(N);
  36. vector <node> vec;
  37. vector <int> weights, path;
  38. bool used[N];
  39.  
  40. void precalc(){
  41.     return;
  42. }
  43.  
  44. bool cmp(node a, node b){
  45.     return a.w < b.w;
  46. }
  47.  
  48. void CL(){
  49.     for(int i = 0; i <= n; i++){
  50.         g[i].clear();
  51.         used[i] = par[i] = 0;
  52.     }
  53. }
  54.  
  55. void dfs(int v, int depth, int p){
  56.     if(depth > d)
  57.         return;
  58.     used[v] = 1;
  59.     par[v] = p;
  60.     if(v == n){
  61.         vector <int> tmp;
  62.         while(v != 0){
  63.             tmp.pb(v);
  64.             v = par[v];
  65.         }
  66.         path = tmp;
  67.         return;
  68.     }
  69.     for(int x : g[v]){
  70.         if(!used[x])
  71.             dfs(x, depth+1, v);
  72.     }
  73. }
  74.  
  75.  
  76. bool check(int x){
  77.     for(int i = 0; i < sz(weights); i++){
  78.         if(weights[i] > x)
  79.             break;
  80.         g[vec[i].u].pb(vec[i].v);
  81.     }
  82.     vector <int> cur_path = {};
  83.     dfs(1, 0, 0);
  84.     bool res = used[n];
  85.     CL();
  86.     return res;
  87. }
  88.  
  89. void solve(){
  90.     cin >> n >> m >> d;
  91.     for(int i = 1; i <= m; i++){
  92.         int u, v, w;
  93.         cin >> u >> v >> w;
  94.         vec.pb({u, v, w});
  95.         weights.pb(w);
  96.         mx = max(mx, w);
  97.     }
  98.     sort(all(vec), cmp);
  99.     sort(all(weights));
  100.     int l = -1, r = mx+1, mid;
  101.     while(l + 1 < r){
  102.         mid = (l + r) >> 1;
  103.         if(check(mid))
  104.             r = mid;
  105.         else
  106.             l = mid;
  107.     }
  108.     if(r == mx+1){
  109.         cout << -1 << nl;
  110.         return;
  111.     }
  112.     reverse(all(path));
  113.     cout << sz(path)-1 << nl;
  114.     for(int x : path)
  115.         cout << x << ' ';
  116.     cout << nl;
  117. }
  118.  
  119. int main() {
  120.     speed;
  121.     //freopen("main.in","r",stdin);
  122.     //freopen("main.out","w",stdout);
  123.     int T = 1;
  124.    
  125.     precalc();
  126.     while (T--)
  127.         solve();
  128.     return 0;
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment