Advertisement
_no0B

Untitled

Jan 7th, 2022
936
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define N ((int)1e5 + 8)
  4. #define MAX ((int)1e9 + 8)
  5. #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
  6.  
  7. using namespace std;
  8.  
  9. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // generator
  10.  
  11.  
  12. int GetRandomNumber(int a , int b)
  13. {
  14.     return uniform_int_distribution<int>(a, b)(rng); //rand([a,b])
  15. }
  16.  
  17. /// dep[i] = max depth from node i to some leaf;
  18.  
  19. int dep[N] , ans[N];
  20.  
  21. /// recursive diameter
  22. void Solve(int node , int par)
  23. {
  24.     ans[node] = 0;
  25.     int maxDep = 0; /// second max depth
  26.     for(auto subTree:edge[node]){
  27.         int child = subTree.first , w = subTree.second;
  28.         if(child == par) continue;
  29.         Solve(child , node);
  30.         ans[node] = max(ans[node] , ans[child]); /// case 1
  31.         int tmp = dep[child] + w;
  32.         maxDep = max(maxDep , tmp);
  33.         if(maxDep > dep[node]) swap(maxDep , dep[node]); /// case 3
  34.     }
  35.     int twoSubTreeDia = dep[node] + maxDep; /// case 2
  36.     ans[node] = max(ans[node] , dep[node]);
  37.     ans[node] = max(ans[node] , twoSubTreeDia);
  38. }
  39.  
  40.  
  41.  
  42. /// diameter using theorem
  43. pair < int , int > Dfs(int node , int par)
  44. {
  45.     pair < int , int > ans = {0,node};
  46.     for(auto next:edge[node]){
  47.         int child = next.first , w = next.second;
  48.         if(child == par) continue;
  49.         pair < int , int > tmp = Dfs(child , node);
  50.         tmp.first += w;
  51.         ans = max(ans , tmp);
  52.     }
  53.     return ans;
  54. }
  55.  
  56. /// determining depth
  57. void Dfs(int node , int par , vector < int > &dep)
  58. {
  59.     for(auto next:edge[node]){
  60.         int child = next.first , w = next.second;
  61.         if(child == par) continue;
  62.         dep[child] = dep[node] + w;
  63.         Dfs(child , node , dep);
  64.     }
  65. }
  66.  
  67.  
  68. /// coloring
  69. bool Dfs(int node , int c)
  70. {
  71.     if(vis[node] != 0){
  72.         if(col[node] == c) return 1;
  73.         return 0;
  74.     }
  75.  
  76.     vis[node] = 1;
  77.     col[node] = c;
  78.     bool ans = 1;
  79.     for(auto next:edge[node]){
  80.         int a = next.first , w = next.second;
  81.         if(w == 1) ans &= Dfs(a , c);
  82.         else ans &= Dfs(a , !c);
  83.     }
  84.     return ans;
  85. }
  86.  
  87. int main()
  88. {
  89.     int n;
  90.     cin>>n;
  91.     for(int i = 1 ; i < n ; i++){
  92.         int a , b , w;
  93.         cin>>a>>b>>w;
  94.         AddEdge(a,b,w);
  95.         AddEdge(b,a,w);
  96.     }
  97.  
  98.     Solve(1,0);
  99.     cout<<ans[1]<<endl;
  100.  
  101.  
  102.     pair < int , int > p = Dfs(1 , 0);
  103.     int a = p.second;
  104.     p = Dfs(a, 0);
  105.     int b = p.second , diameter = p.first;
  106.  
  107.     vector < int > disFromA(n+1) , disFromB(n+1);
  108.     disFromA[a] = 0;
  109.     Dfs(a , 0 , disFromA);
  110.  
  111.     disFromB[b] = 0;
  112.     Dfs(b , 0 , disFromB);
  113.  
  114.     for(int i  = 1 ; i <= n ; i++){
  115.         cout<<max(disFromA[i] ,  disFromB[i])<<endl;
  116.     }
  117.  
  118.  
  119.  
  120.     Solve(R , 0);
  121.     while(q--){
  122.         int node;
  123.         cin>>node;
  124.         cout<<ans[node]<<endl;
  125.     }
  126.  
  127.     int m , n;
  128.  
  129.     cin>>m>>n;
  130.  
  131.     for(int i = 1 ; i <= m ; i++) cin>>status[i];
  132.     memset(vis,0,sizeof vis);
  133.     for(int i = 1 ; i <= n ; i++){
  134.         int doors;
  135.         cin>>doors;
  136.         while(doors){
  137.             int cur;
  138.             cin>>cur;
  139.             if(vis[cur] == 0){
  140.                 vis[cur] = i;
  141.             }
  142.             else{
  143.                 int a = vis[cur];
  144.                 AddEdge(i , a, status[cur]);
  145.                 AddEdge(a , i, status[cur]);
  146.             }
  147.         }
  148.     }
  149.     bool ans = 1;
  150.     memset(vis,0,sizeof vis);
  151.     for(int i = 1 ; i <= n ; i++){
  152.         if(vis[i] == 0) ans &= Dfs(i , 0);
  153.     }
  154.     if(ans) cout<<"YES\n";
  155.     else cout<<"NO\n";
  156. }
  157.  
  158.  
  159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement