CF1738D

[[This is a tag]]

建图,然后在图上使用一种遍历策略来输出一种遍历顺序,构造出了答案序列

虽然链表似乎也可以,但是建图简单得多

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,T,a,b[N],ans[N],s,k,cn;
vector<int>g[N];
void dfs(int u){
	for(auto v:g[u])if(g[v].empty())ans[++cn]=v;
	for(auto v:g[u])if(g[v].size())ans[++cn]=v,dfs(v);
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++)scanf("%d",b+i);
		k=-1;cn=0;
		for(int i=1;i<=n;i++)if(b[i]<i){
			k=i-1;
			break;
		}
		if(!~k)k=n;
		for(int i=1;i<=k;i++){
			if(b[i]==n+1)s=0;
			else s=b[i];
			g[s].push_back(i);
		}
		for(int i=k+1;i<=n;i++){
			s=b[i];
			g[s].push_back(i);
		}
		dfs(0);
		printf("%d\n",k);
		for(int i=1;i<=n;i++)printf("%d ",ans[i]);printf("\n");
		for(int i=0;i<=n;i++)g[i].clear();
	}
}
posted @ 2022-12-11 11:51  -WD-  阅读(67)  评论(0)    收藏  举报