Skip to content

Commit a29b60f

Browse files
committed
Added Tree Permutations to DP
1 parent 5f16e1a commit a29b60f

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
Problem- TREEPREM
2+
3+
#include<bits/stdc++.h>
4+
using namespace std;
5+
const long long mod = 1000000007;
6+
vector<long long> graph[100001];
7+
long long A[1000001];
8+
long long B[1000001];
9+
long long con[1000001];
10+
long long a[100001];
11+
long long b[100001];
12+
long long par[100001];
13+
long long h[100001];
14+
long long vis[100001];
15+
vector<long long> sset;
16+
priority_queue<pair<long long,long long> > LT;
17+
long long n,s;
18+
long long TEMP;
19+
void solve1(long long SUP,long long d)
20+
{
21+
vis[SUP]++;
22+
h[SUP] = d;
23+
bool is_it = true;
24+
for(long long CHD:graph[SUP])
25+
{
26+
if(!vis[CHD])
27+
{
28+
par[CHD] = SUP;
29+
solve1(CHD,d+1);
30+
is_it = false;
31+
}
32+
}
33+
if(is_it==true)
34+
LT.push({d,SUP});
35+
}
36+
void done()
37+
{
38+
for(long long i=0;i<n+1;i++)
39+
{
40+
graph[i].clear();
41+
a[i] = 0;
42+
b[i] = 0;
43+
par[i] = 0;
44+
h[i] = 0;
45+
}
46+
while(!LT.empty())
47+
LT.pop();
48+
}
49+
void clean(long long SUP)
50+
{
51+
con[a[SUP]] = 0;
52+
con[b[SUP]] = 0;
53+
A[a[SUP]] = 0;
54+
A[b[SUP]] = 0;
55+
B[a[SUP]] = 0;
56+
B[b[SUP]] = 0;
57+
}
58+
int solve2(long long SUP)
59+
{
60+
B[b[SUP]]++;
61+
A[a[SUP]]++;
62+
if(A[a[SUP]]==B[a[SUP]] && con[a[SUP]]!=0)
63+
{
64+
con[a[SUP]]--;
65+
TEMP--;
66+
}
67+
else if(con[a[SUP]]==0)
68+
{
69+
con[a[SUP]]++;
70+
TEMP++;
71+
}
72+
if(A[b[SUP]]==B[b[SUP]] && con[b[SUP]]!=0)
73+
{
74+
con[b[SUP]]--;
75+
TEMP--;
76+
}
77+
else if(con[b[SUP]]==0)
78+
{
79+
con[b[SUP]]++;
80+
TEMP++;
81+
}
82+
vis[SUP]++;
83+
sset.push_back(SUP);
84+
if(TEMP==0)
85+
{
86+
if(vis[par[SUP]]==0 && SUP!=1)
87+
LT.push(make_pair(h[par[SUP]], par[SUP]));
88+
clean(SUP);
89+
return 1;
90+
}
91+
if(SUP==1)
92+
{
93+
clean(SUP);
94+
return 0;
95+
}
96+
if(vis[par[SUP]]==0)
97+
{
98+
if(solve2(par[SUP])==1)
99+
{
100+
clean(SUP);
101+
return 1;
102+
}
103+
}
104+
clean(SUP);
105+
return 0;
106+
}
107+
int sol()
108+
{
109+
cin>>n>>s;
110+
for(long long i=0;i<n-1;i++)
111+
{
112+
long long u,v;
113+
cin>>u>>v;
114+
graph[u].push_back(v);
115+
graph[v].push_back(u);
116+
}
117+
for(long long i=1;i<n+1;i++)
118+
cin>>a[i];
119+
for(long long i=1;i<n+1;i++)
120+
cin>>b[i];
121+
for(long long i=1;i<n+1;i++)
122+
{
123+
vis[i] = 0;
124+
par[i] = 0;
125+
h[i] = 0;
126+
}
127+
solve1(1,1);
128+
for(long long i=1;i<n+1;i++)
129+
vis[i]=0;
130+
bool correct = true;
131+
vector<vector<long long> > sets;
132+
while(!LT.empty())
133+
{
134+
pair<long long,long long> leaf = LT.top();
135+
LT.pop();
136+
if(vis[leaf.second]==0)
137+
{
138+
TEMP = 0;
139+
sset.clear();
140+
if(solve2(leaf.second)==0)
141+
{
142+
correct = false;
143+
break;
144+
}
145+
else
146+
sets.push_back(sset);
147+
}
148+
}
149+
if(correct==false)
150+
{
151+
cout<<0<<endl;
152+
return 0;
153+
}
154+
if(s==1)
155+
{
156+
cout<<1<<endl;
157+
return 0;
158+
}
159+
long long a = 1;
160+
long long x = sets.size();
161+
for(long long i=0;i<x;i++)
162+
{
163+
long long u = sets[i][0];
164+
long long l = sets[i][0];
165+
long long sze = sets[i].size();
166+
for(long long j=1;j<sze;j++)
167+
{
168+
if(h[sets[i][j]]>h[l])
169+
l = sets[i][j];
170+
if(h[sets[i][j]]<h[u])
171+
u = sets[i][j];
172+
}
173+
long long cnt = 0;
174+
for(long long c: graph[l])
175+
{
176+
if(c!=par[l])
177+
cnt++;
178+
}
179+
a = (a*(cnt+1))%mod;
180+
}
181+
cout<<a<<endl;
182+
return 0;
183+
}
184+
int main()
185+
{
186+
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
187+
long long T;
188+
cin>>T;
189+
for(long long i=0;i<T;i++)
190+
{
191+
sol();
192+
done();
193+
}
194+
return 0;
195+
}

0 commit comments

Comments
 (0)