Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- pair<int,int> dfs(map<int,vector<int>> &hm,vector<int> &S, int src,int par,map<int,int> &room){
- int fireAlpino = 0;
- int iceTender = 0;
- if(S[src]==1){
- fireAlpino++;
- }
- else{
- iceTender++;
- }
- if(hm[src].size()==1 && src!=1){
- return {fireAlpino, iceTender};
- }
- for(auto i : hm[src]){
- if(i!=par){
- pair<int,int> temp =dfs(hm,S,i,src,room);
- fireAlpino+=temp.first;
- iceTender+=temp.second;
- }
- }
- if(fireAlpino == iceTender){
- room[src] = fireAlpino;
- }
- return {fireAlpino, iceTender};
- }
- void heavenlyRooms(int N, vector<int> &S, vector<pair<int,int>> &edge){
- map<int,vector<int>> hm;
- for(int i=0;i<N-1;i++){
- hm[edge[i].first].push_back(edge[i].second);
- hm[edge[i].second].push_back(edge[i].first);
- }
- map<int,int> heavenlyRoom;
- dfs(hm,S,1,-1,heavenlyRoom);
- cout<<heavenlyRoom.size()<<endl;
- for(auto i : heavenlyRoom){
- cout<<i.first<<" "<<i.second<<endl;
- }
- }
- int main(){
- int N;
- cin>>N;
- vector<int> S(N+1);
- for(int i=1;i<=N;i++){
- cin>>S[i];
- }
- vector<pair<int,int>> edge(N-1);
- for(int i=2;i<=N;i++){
- int U,V;
- cin>>U>>V;
- edge[i-2] = make_pair(U,V);
- }
- heavenlyRooms(N,S,edge);
- }
Advertisement
Add Comment
Please, Sign In to add comment