MLE on#16 求调
查看原帖
MLE on#16 求调
524971
EatBread楼主2024/4/18 17:07

rt,玄关

code:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct sb{
    int nx,to;
}e[N*2],e2[N*2];
int down[N],up[N],h[N],idx,h2[N],idx2,low[N],dfn[N],n,m,k,sc,fl[N*2],jld[N],hscc,dep[N],f[N][25],scc[N];
void add(int x,int y){
    e[++idx].to=y;
    e[idx].nx=h[x];
    h[x]=idx;
}
void add2(int x,int y){
    e2[++idx2].to=y;
    e2[idx2].nx=h2[x];
    h2[x]=idx2;
}
void tarjan(int u,int dad){
	dfn[u]=low[u]=++sc;
	for(int i=h[u]; i; i=e[i].nx){
		int v=e[i].to;
		if(v==dad)continue;
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u])fl[i]=fl[i^1]=1;
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
void dfs_bs(int u,int h_s){
	jld[u]=h_s;
	for(int i=h[u]; i; i=e[i].nx){
		int v=e[i].to;
		if(jld[v]||fl[i])continue;
		dfs_bs(v,h_s);
	}
}
void dfs_lca(int u,int fa){
    dep[u]=dep[fa]+1,scc[u]=sc,f[u][0]=fa;
    for(int k=1; k<=20; k++)
        f[u][k]=f[f[u][k-1]][k-1]; 
    for(int i=h2[u]; i; i=e2[i].nx){
        int v=e2[i].to;   
        if(v==fa)continue;
        dfs_lca(v,u);
    }
}
int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i=20; i>=0; i--)
        if(dep[f[x][i]]>=dep[y])
            x=f[x][i];
    if(x==y)return y;
    for(int i=20; i>=0; i--)
        if(f[x][i]!=f[y][i])
            x=f[x][i],y=f[y][i];
    return f[x][0];
}
bool check(int u,int fa){
    for(int i=h2[u]; i; i=e2[i].nx){
    	int v=e2[i].to;
    	if(fa==v)continue;
    	if(!check(v,u)||(down[v]&&up[v]))
			return 0;
		down[u]+=down[v];
		up[u]+=up[v];
    }
    return 1;
}
signed main(){
	cin>>n>>m>>k;
	for(int i=1; i<=m; i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	for(int i=1; i<=n; i++)if(!dfn[i])tarjan(i,0);
	for(int i=1; i<=n; i++)if(!jld[i])dfs_bs(i,++hscc);
	for(int i=1; i<=n; i++){
		for(int j=h[i]; j; j=e[j].nx){
			int v=e[j].to;
			if(jld[i]<jld[v])add2(jld[i],jld[v]),add2(jld[v],jld[i]);
		}
	}sc=0;
	for(int i=1; i<=hscc; i++)if(!scc[i])sc++,dfs_lca(i,0);
	for(int i=1; i<=k; i++){
		int u,v;
		scanf("%d%d",&u,&v);
		u=jld[u],v=jld[v];
		if(u==v)continue;
		if(scc[u]!=scc[v]){
			cout<<"No";
			return 0;
		}
		int d=lca(u,v);
		up[u]++,down[v]++;
		down[d]--,up[d]--;
	}
	for(int i=1; i<=hscc; i++){
		if(!f[i][0]&&!check(i,0)){
			cout<<"No";
			return 0;
		}
	}
	cout<<"Yes";
	return 0;
}
2024/4/18 17:07
加载中...