鸽着,我不知道为什么对?

  • 题意:
  • 思路:
  • code:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int p[N],nxt[N],to[N],head[N],ecnt,d[N];
void add_edge(int u,int v,int i) {nxt[++ecnt]=head[u];d[ecnt]=i;to[ecnt]=v;head[u]=ecnt;}
int fa[N],dep[N],In[N],id[N];
void init(int u) {
	for(int i=head[u];i;i=nxt[i]) {
		int v=to[i];if(v==fa[u])continue;
		dep[v]=dep[u]+1;fa[v]=u;id[v]=d[i];
		init(v);
	}
}
vector<int> R[N];
void Go_up(int x,int y) {
	int u=x,v=y,lx=0,ly=0;
	while(u!=v) {
		if(dep[u]>dep[v]) {
			if(lx){R[lx].push_back(id[u]);In[id[u]]++;}
			lx=id[u];u=fa[u];
		}
		else {
			if(ly) {R[id[v]].push_back(ly);In[ly]++;}
			ly=id[v];v=fa[v];
		}
	}
	if(lx&&ly) {R[lx].push_back(ly);In[ly]++;}
}
int hd=1,tl,Q[N];
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {scanf("%d",&p[i]);}
	for(int i=1;i<=m;i++) {int x,y;scanf("%d%d",&x,&y);add_edge(x,y,i),add_edge(y,x,i);}
	for(int i=1;i<=n;i++) if(!dep[i])init(i);
//	printf("!");
	for(int i=1;i<=n;i++) {if(i!=p[i])Go_up(i,p[i]);}
	for(int i=1;i<=m;i++) if(!In[i])Q[++tl]=i;
	while(hd<=tl) {
		int u=Q[hd++];
		printf("%d ",u);
		for(int i=0;i<R[u].size();i++) {
			int v=R[u][i];
			if(!--In[v]) {Q[++tl]=v;}
		}
	}
	return 0;
}