讨论区说和重边有关,但我跳过重边也还是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
*/