#include<bits/stdc++.h>
using namespace std;
struct edge{int to,nxt;};
const int N=200009;
edge e[N*2];
int hd[N],nE,p[N],dfn[N],nC,timer,n;
vector<int> circle[N];
void add(int u,int v){
e[++nE]=(edge{v,hd[u]});
hd[u]=nE;
}
void dfs(int u,int fa){
p[u]=fa;
dfn[u]=++timer;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
dfs(v,u);
continue;
}
if(v==fa) continue;
if(dfn[v]<dfn[u]) continue;
nC++;
circle[nC].push_back(u);
for(;v!=u;v=p[v])
circle[nC].push_back(v);
}
}
void print(vector<int> &C){
int len=C.size();
int ID=0;
for(int i=0;i<len;++i)
if(C[i]<C[ID]){ ID=i;break;}
cout<<C[ID];
int LID=(ID==0?len:ID)-1;
int RID=(ID==len-1?0:ID)+1;
int delta;
delta=(C[LID]<C[RID]?-1:1);
for(int i=1;i<len;++i){
ID+=delta;
if(ID==-1) ID=len-1;
else if(ID==len)ID=0;
cout<<" "<<C[ID];
}
cout<<endl;
}
int main(){
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
add(i,x);
add(x,i);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) dfs(i,0);
}
cout<<nC<<endl;
for(int k=1;k<=nC;++k) print(circle[k]);
return 0;
}
最小基环树,算法部分是对的,只有输出不对,hack数据是 input
100 53 36 52 3 4 22 2 5 3 3 36 10 5 81 10 38 10 12 1 4 7 9 87 8 11 66 24 53 64 82 6 82 39 13 31 17 51 36 29 16 7 30 54 68 30 35 57 37 97 19 13 24 43 53 31 23 45 43 46 30 3 12 62 30 31 36 43 36 13 16 69 61 2 63 54 50 47 65 37 76 48 63 39 37 37 44 6 73 55 32 44 51 50 84 42 67 57 12 56 75 output
2 3 4 5 8 24 52 43 53 54 myOutput
2 43 53 54 3 4 5 8 24 52
输出的最小索引顺序不对,怎么改啊……改了一晚上了,求助
输出用的是最小表示法的输出