运用dfs求连通块,vis标记理论 O(n) ,但是dfs内部循环还是使得此做法只能 O(nm) m:每个节点联通的节点个数,有没有dalao能优化一下啊
#include <bits/stdc++.h>
//#include <sys/mman.h>
//char *buff = (char *)mmap(0, 1073741824, PROT_READ, MAP_SHARED, 0, 0);
//#define getchar() *buff++
using namespace std;
const int maxn=100001;
int n,m,fa[maxn],col[maxn];
char out[maxn];
bool vis[maxn]={0,1};
vector<int> mp[maxn];
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0')ch=getchar();
while (ch>='0') ret=ret*10+(ch^48),ch=getchar();
return ret;
}
inline int Get(int x){return fa[x];}
void dfs(int x,int f){
if(col[x]==col[f])fa[x]=f;
else f=fa[x];
for(int i:mp[x]){
if(!vis[i]){
vis[i]=1;
dfs(i,f);
}
}
}
int main(){
n=read(),m=read();
for (int i=1;i<=n;i++) col[i]=getchar(),fa[i]=i;
for (int i=1;i<n;i++){
int x=read(),y=read();
// if (col[x]!=col[y]) continue;
// int fx=Get(x),fy=Get(y);
// fa[fx]=fy;
mp[x].push_back(y);
mp[y].push_back(x);
}
dfs(1,1);
for (int i=0;i<m;i++){
int x=read(),y=read();
char ch=getchar();
int fx=Get(x),fy=Get(y);
if (fx==fy&&col[x]!=ch) out[i]='0';else out[i]='1';
}
fwrite(out,m,1,stdout);
return 0;
}