MLE 40pts 求调
查看原帖
MLE 40pts 求调
457427
LittleChara楼主2023/9/13 20:00

不知道为啥会 mle。

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned long long
#define db double
#define ld long double

#define M 20005
#define N 2000005
#define mod 1000000007
#define inf 1e9
#define dinf 1e15
#define linf 1e18+7
#define eps 1e-15
#define delta 0.997

int n,m,q;
vector<int> e[M];

int dfnn[M],low[M],idx,fat[M];
int cut[M];
int lx[M],cnt;

vector<int> g[M];

void tarjan(int u){
	dfnn[u]=low[u]=++idx;
	int sum=0;
	for(auto v:e[u]){
		if(!dfnn[v]){
			++sum;
			fat[v]=u;
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(fat[u]!=u&&low[v]>=dfnn[u]) cut[u]=1;
		} else low[u]=min(low[u],dfnn[v]);
	}
	if(sum>1&&fat[u]==u) cut[u]=1;
}

void change(int u){
	lx[u]=cnt;
	for(auto v:e[u]) if(!lx[v]&&!cut[v]) change(v);
}

unordered_map<int,int> vis[M];

int hson[M],siz[M],fa[M],dep[M];
int top[M],dfn[M],rk[M],tot;

void dfs1(int u,int f,int pos){
	hson[u]=-1;
	siz[u]=1;
	fa[u]=f;
	dep[u]=pos;
	for(auto v:g[u]){
		if(v==f) continue;
		dfs1(v,u,pos+1);
		siz[u]+=siz[v];
		if(!~hson[u]||siz[hson[u]]<siz[v]) hson[u]=v;
	}
}

void dfs2(int u,int tp){
	top[u]=tp;
	dfn[u]=++tot;
	rk[tot]=u;
	if(!~hson[u]) return;
	dfs2(hson[u],tp);
	for(auto v:g[u]){
		if(v==fa[u]||v==hson[u]) continue;
		dfs2(v,v);
	}
}

bool chk(int u,int v,int x){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		if(dfn[top[u]]<=dfn[x]&&dfn[x]<=dfn[u]) return 1;
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	return dfn[u]<=dfn[x]&&dfn[x]<=dfn[v];
} 

int main(){
	scanf("%d %d",&n,&m);
	while(m--){
		int u,v;
		scanf("%d %d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	} 
	fat[1]=1;
	tarjan(1);
	for(int i=1;i<=n;++i){
		if(lx[i]) continue;
		++cnt;
		if(cut[i]){
			lx[i]=cnt;
			continue;
		}
		change(i);
	}
//	for(int i=1;i<=n;++i) printf("%d%c",lx[i],i==n?'\n':' '); byd 破防了 
	for(int u=1;u<=n;++u){
		for(auto v:e[u]){
			if(lx[u]==lx[v]||vis[lx[u]].count(lx[v])) continue;
			g[lx[u]].push_back(lx[v]);
			vis[lx[u]][lx[v]]=1;
		}
	}
	dfs1(1,0,1);
	dfs2(1,1);
	scanf("%d",&q);
	while(q--){
		int u,v,x;
		scanf("%d %d %d",&u,&v,&x);
		if(!cut[x]){
			printf("no\n");
			continue;
		}
		u=lx[u]; v=lx[v]; x=lx[x];
		if(chk(u,v,x)) printf("yes\n");
		else printf("no\n");
	} 
	return 0;
}
2023/9/13 20:00
加载中...