理论O(n)的做法
查看原帖
理论O(n)的做法
1125000
wuming_z楼主2024/8/24 10:52

运用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;
}
2024/8/24 10:52
加载中...