CF1592C Bakry and Partitioning 题解
显然只会分成
如果是分成 YES 就可以了。
然后就是总异或和不为
考虑如何处理这个过程。显然,分成
最终判断是否 YES 否则输出 NO。
::::success[code && submission]
#include<bits/stdc++.h>
#define LL long long
#define UInt unsigned int
#define ULL unsigned long long
#define LD long double
#define pii pair<int,int>
#define pLL pair<LL,LL>
#define pDD pair<LD,LD>
#define fr first
#define se second
#define pb push_back
#define isr insert
#define _i128 __int128
using namespace std;
const int N = 2e5+5;
int T,n,k,St,Ed,flag[N];
LL Ans;
vector<int> g[N];
int read(){
int su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
void DFS_init(int u,int fa){
for(int v:g[u])if(v^fa)
DFS_init(v,u),flag[u]=max(flag[u],flag[v]);
return;
}
void DFS_sol(int u,int fa){
for(int v:g[u])if(v^fa){
if(flag[v]==1)DFS_sol(v,u),Ans+=2;
if(flag[v]==2)DFS_sol(v,u),Ans+=1;
}return;
}
int main(){
T=read();
while(T--){
n=read(),k=read();
St=read(),Ed=read();
for(int i=1;i<=n;i++)g[i].clear(),flag[i]=0;
for(int i=1;i<=k;i++)flag[read()]=1;
flag[Ed]=2;
for(int i=1;i<n;i++){
int x=read(),y=read();
g[x].pb(y),g[y].pb(x);
}
Ans=0;
DFS_init(St,0);DFS_sol(St,0);
cout<<Ans<<"\n";
}
return 0;
}
::::
如果本篇题解对你有帮助的话,麻烦你点一个小小的赞,真是太感谢啦!