Advertisement
Dang_Quan_10_Tin

dfs

Mar 10th, 2021
644
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #define task "dfs"
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. const int Inf = 1e9 + 7;
  10. const int N = 4e5 + 5;
  11. int n, k, l, cntno[N];
  12. int v[N], cnt[N], dp[N][4], cnt1[N];
  13. bool vis[N], ck[N];
  14. vector<int> adj[N];
  15.  
  16. void Read()
  17. {
  18.     cin >> n >> k;
  19.     for (int i = 1; i <= n; ++i)
  20.         cin >> v[i];
  21.     for (int i = 1; i < n; ++i)
  22.     {
  23.         int u, v;
  24.         cin >> u >> v;
  25.         adj[u].emplace_back(v);
  26.         adj[v].emplace_back(u);
  27.     }
  28. }
  29.  
  30. void dfscnt(int v)
  31. {
  32.     vis[v] = 1;
  33.     cnt[v] = 1;
  34.     bool flag(0);
  35.     for (auto i : adj[v])
  36.         if (!vis[i])
  37.         {
  38.             if (ck[i])
  39.             {
  40.                 dfscnt(i);
  41.                 if (cnt[i] == 0)
  42.                     flag = 1;
  43.                 else
  44.                     cnt[v] += cnt[i];
  45.                 cntno[v] += cntno[i];
  46.                 vis[i] = 0;
  47.             }
  48.             else
  49.             {
  50.                 flag = 1;
  51.                 ++cntno[v];
  52.             }
  53.         }
  54.     cnt1[v] = cnt[v];
  55.     if (flag)
  56.         cnt[v] = 0;
  57. }
  58.  
  59. void dfs(int v, const int &root)
  60. {
  61.     vis[v] = 1;
  62.     cnt[v] = 1;
  63.     bool flag(0);
  64.     int max1(0), max2(0);
  65.     for (auto i : adj[v])
  66.         if (!vis[i])
  67.         {
  68.             if (ck[i])
  69.             {
  70.                 dfs(i, root);
  71.                 if (cnt[i] == 0)
  72.                 {
  73.                     flag = 1;
  74.                     dp[v][1] = max(dp[v][1], dp[i][1] + (cntno[i] == cntno[root]) * cnt1[v]);
  75.                     if (max1 < dp[i][0])
  76.                     {
  77.                         max2 = max1;
  78.                         max1 = dp[i][0];
  79.                     }
  80.                     else if (max2 < dp[i][0])
  81.                         max2 = dp[i][0];
  82.                 }
  83.                 else
  84.                     cnt[v] += cnt[i];
  85.                 dp[v][3] = max(dp[v][3], dp[i][3]);
  86.             }
  87.             else
  88.             {
  89.                 flag = 1;
  90.             }
  91.         }
  92.     dp[v][3] = max(dp[v][3], cnt[v]);
  93.     if (flag)
  94.     {
  95.         dp[v][0] = max1 + cnt[v];
  96.         dp[v][1] = max(dp[v][1], max1 + max2 + cnt[v]);
  97.         cnt[v] = 0;
  98.     }
  99. }
  100.  
  101. bool Check(int val)
  102. {
  103.     for (int i = 1; i <= n; ++i)
  104.     {
  105.         vis[i] = 0;
  106.         ck[i] = v[i] >= val;
  107.         cnt[i] = cnt1[i] = cntno[i] = dp[i][0] = dp[i][1] = dp[i][3] = 0;
  108.     }
  109.     vector<int> s;
  110.     s.reserve(n);
  111.     for (int i = 1; i <= n; ++i)
  112.         if (!ck[i])
  113.             for (auto j : adj[i])
  114.                 if (ck[j])
  115.                     s.emplace_back(j);
  116.     if (s.empty())
  117.         for (int i = 1; i <= n; ++i)
  118.             if (ck[i])
  119.             {
  120.                 s.emplace_back(i);
  121.                 break;
  122.             }
  123.     for (auto i : s)
  124.         if (!vis[i])
  125.         {
  126.             dfscnt(i);
  127.             dfs(i, i);
  128.             //cout << i << " " << dp[i][1] << " " << dp[i][0] << " " << dp[i][3] << "\n";
  129.             if (dp[i][1] >= k || dp[i][0] >= k || dp[i][3] >= k)
  130.                 return true;
  131.         }
  132.     return false;
  133. }
  134.  
  135. void Solve()
  136. {
  137.     int l = 1, m, h = 1e6;
  138.     while (l <= h)
  139.     {
  140.         m = (l + h) / 2;
  141.         if (Check(m))
  142.             l = m + 1;
  143.         else
  144.             h = m - 1;
  145.     }
  146.     cout << h;
  147. }
  148.  
  149. int32_t main()
  150. {
  151.     ios_base::sync_with_stdio(0);
  152.     cin.tie(0);
  153.     cout.tie(0);
  154.     if (fopen(task ".INP", "r"))
  155.     {
  156.         freopen(task ".INP", "r", stdin);
  157.         freopen(task ".OUT", "w", stdout);
  158.     }
  159.     Read();
  160.     Solve();
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement