调疯了WaOn#2这到底啥数据点????
查看原帖
调疯了WaOn#2这到底啥数据点????
213535
Bluebird_楼主2023/8/25 21:34

讨论区说和重边有关,但我跳过重边也还是WA,the father of 10 is wrong???

快交了一页了。。。蒟蒻求助,。。。。

#include<bits/stdc++.h>
using namespace std;
int rd()
{
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0')f=ch=='-'?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void wr(int x)
{
	if(x>9)wr(x/10);
	putchar(x%10+'0');
}
const int N=4e5+10;
int n,m,st[N][30],f[N],dep[N],d[N],in[N],vis[N],tot;
int to[N],nxt[N],head[N],cnt;
vector<int>g[N];
void add(int u,int v){g[u].push_back(v);}
void add2(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
void dfs1(int u,int fa)
{
	for(int i=0;i<g[u].size();++i)
	{
		int v=g[u][i];
		if(v==fa||f[v]!=u)continue;
		dep[v]=dep[u]+1;st[v][0]=u;
		dfs1(v,u);
	}
}
void jump(int u,int v)
{
    v=st[v][0];
	for(int i=20;i>=0;--i)
        if(st[u][i]!=st[v][i])u=st[u][i],v=st[v][i];
    add2(v,u);in[u]++;//cout<<v<<" > "<<u<<endl;
}
map<pair<int,int>,bool>mp;
void dfs2(int u,int fa)
{
	for(int i=0;i<g[u].size();++i)
	{
		int v=g[u][i];
		if(v==fa)continue;
        if(mp[make_pair(u,v)]==1)continue;
		if(f[v]!=u){
			if(dep[v]<=dep[u])continue;
            if(mp[make_pair(u,v)]==1)continue;
			jump(u,v);
            mp[make_pair(u,v)]=1;
			continue;
		}
        mp[make_pair(u,v)]=1;
		dfs2(v,u);
	}
}
void tp(int u)
{
	vis[u]=1;
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		in[v]--;
		if(!in[v])d[v]=d[u]+1,tp(v);
        tot=max(tot,d[v]);
	}
}
bool cmp(int x,int y){return d[x]==d[y]?x>y:d[x]<d[y];}
void init()
{
    for(int i=1;i<=20;++i)
        for(int j=1;j<=n;++j)
            st[j][i]=st[st[j][i-1]][i-1];
}
int main()
{
	n=rd();m=rd();
	for(int i=1;i<=m;++i)
	{
		int u=rd(),v=rd();
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;++i)
		f[i]=rd();
	dep[1]=1;st[1][0]=1;
	dfs1(1,-1);
    init();
	dfs2(1,-1);
	for(int i=1;i<=n;++i)
		if(in[i]==0&&vis[i]==0)d[i]=++tot,tp(i);
	for(int i=1;i<=n;++i)
		sort(g[i].begin(),g[i].end(),cmp);
    for(int u=1;u<=n;++u)
		for(int i=0;i<g[u].size();++i)
		{
			int v=g[u][i];
            if(dep[v]<dep[u])continue;
            if(dep[v]==dep[u]&&u<v)continue;
			wr(u);putchar(' ');wr(v);putchar('\n');
		}
	return 0;
} 
/*
8 9
1 2
1 3
2 4
2 5
3 6
3 7
3 5
6 8
5 8
0 1 1 2 2  3 3 5
*/
2023/8/25 21:34
加载中...