Samkit5025

Untitled

Sep 27th, 2022
494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. pair<int,int> dfs(map<int,vector<int>> &hm,vector<int> &S, int src,int par,map<int,int> &room){
  5.     int fireAlpino = 0;
  6.     int iceTender = 0;
  7.     if(S[src]==1){
  8.         fireAlpino++;
  9.     }
  10.     else{
  11.         iceTender++;
  12.     }
  13.  
  14.     if(hm[src].size()==1 && src!=1){
  15.         return {fireAlpino, iceTender};
  16.     }
  17.  
  18.     for(auto i : hm[src]){
  19.         if(i!=par){
  20.             pair<int,int> temp =dfs(hm,S,i,src,room);
  21.             fireAlpino+=temp.first;
  22.             iceTender+=temp.second;
  23.         }
  24.     }  
  25.     if(fireAlpino == iceTender){
  26.         room[src] = fireAlpino;
  27.     }
  28.  
  29.     return {fireAlpino, iceTender};
  30. }
  31.  
  32. void heavenlyRooms(int N, vector<int> &S, vector<pair<int,int>> &edge){
  33.     map<int,vector<int>> hm;
  34.  
  35.     for(int i=0;i<N-1;i++){
  36.         hm[edge[i].first].push_back(edge[i].second);
  37.         hm[edge[i].second].push_back(edge[i].first);
  38.     }
  39.  
  40.     map<int,int> heavenlyRoom;
  41.  
  42.     dfs(hm,S,1,-1,heavenlyRoom);
  43.  
  44.     cout<<heavenlyRoom.size()<<endl;
  45.     for(auto i : heavenlyRoom){
  46.         cout<<i.first<<" "<<i.second<<endl;
  47.     }
  48. }
  49.  
  50. int main(){
  51.     int N;
  52.     cin>>N;
  53.  
  54.     vector<int> S(N+1);
  55.     for(int i=1;i<=N;i++){
  56.         cin>>S[i];
  57.     }
  58.  
  59.     vector<pair<int,int>> edge(N-1);
  60.     for(int i=2;i<=N;i++){
  61.         int U,V;
  62.         cin>>U>>V;
  63.         edge[i-2] = make_pair(U,V);
  64.     }
  65.  
  66.     heavenlyRooms(N,S,edge);  
  67. }
Advertisement
Add Comment
Please, Sign In to add comment