Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define LL long long
- #define N ((int)1e5 + 8)
- #define MAX ((int)1e9 + 8)
- #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
- using namespace std;
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // generator
- int GetRandomNumber(int a , int b)
- {
- return uniform_int_distribution<int>(a, b)(rng); //rand([a,b])
- }
- /// dep[i] = max depth from node i to some leaf;
- int dep[N] , ans[N];
- /// recursive diameter
- void Solve(int node , int par)
- {
- ans[node] = 0;
- int maxDep = 0; /// second max depth
- for(auto subTree:edge[node]){
- int child = subTree.first , w = subTree.second;
- if(child == par) continue;
- Solve(child , node);
- ans[node] = max(ans[node] , ans[child]); /// case 1
- int tmp = dep[child] + w;
- maxDep = max(maxDep , tmp);
- if(maxDep > dep[node]) swap(maxDep , dep[node]); /// case 3
- }
- int twoSubTreeDia = dep[node] + maxDep; /// case 2
- ans[node] = max(ans[node] , dep[node]);
- ans[node] = max(ans[node] , twoSubTreeDia);
- }
- /// diameter using theorem
- pair < int , int > Dfs(int node , int par)
- {
- pair < int , int > ans = {0,node};
- for(auto next:edge[node]){
- int child = next.first , w = next.second;
- if(child == par) continue;
- pair < int , int > tmp = Dfs(child , node);
- tmp.first += w;
- ans = max(ans , tmp);
- }
- return ans;
- }
- /// determining depth
- void Dfs(int node , int par , vector < int > &dep)
- {
- for(auto next:edge[node]){
- int child = next.first , w = next.second;
- if(child == par) continue;
- dep[child] = dep[node] + w;
- Dfs(child , node , dep);
- }
- }
- /// coloring
- bool Dfs(int node , int c)
- {
- if(vis[node] != 0){
- if(col[node] == c) return 1;
- return 0;
- }
- vis[node] = 1;
- col[node] = c;
- bool ans = 1;
- for(auto next:edge[node]){
- int a = next.first , w = next.second;
- if(w == 1) ans &= Dfs(a , c);
- else ans &= Dfs(a , !c);
- }
- return ans;
- }
- int main()
- {
- int n;
- cin>>n;
- for(int i = 1 ; i < n ; i++){
- int a , b , w;
- cin>>a>>b>>w;
- AddEdge(a,b,w);
- AddEdge(b,a,w);
- }
- Solve(1,0);
- cout<<ans[1]<<endl;
- pair < int , int > p = Dfs(1 , 0);
- int a = p.second;
- p = Dfs(a, 0);
- int b = p.second , diameter = p.first;
- vector < int > disFromA(n+1) , disFromB(n+1);
- disFromA[a] = 0;
- Dfs(a , 0 , disFromA);
- disFromB[b] = 0;
- Dfs(b , 0 , disFromB);
- for(int i = 1 ; i <= n ; i++){
- cout<<max(disFromA[i] , disFromB[i])<<endl;
- }
- Solve(R , 0);
- while(q--){
- int node;
- cin>>node;
- cout<<ans[node]<<endl;
- }
- int m , n;
- cin>>m>>n;
- for(int i = 1 ; i <= m ; i++) cin>>status[i];
- memset(vis,0,sizeof vis);
- for(int i = 1 ; i <= n ; i++){
- int doors;
- cin>>doors;
- while(doors){
- int cur;
- cin>>cur;
- if(vis[cur] == 0){
- vis[cur] = i;
- }
- else{
- int a = vis[cur];
- AddEdge(i , a, status[cur]);
- AddEdge(a , i, status[cur]);
- }
- }
- }
- bool ans = 1;
- memset(vis,0,sizeof vis);
- for(int i = 1 ; i <= n ; i++){
- if(vis[i] == 0) ans &= Dfs(i , 0);
- }
- if(ans) cout<<"YES\n";
- else cout<<"NO\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement