啊啊啊怎么改啊
查看原帖
啊啊啊怎么改啊
544989
外星球来的人楼主2023/12/10 20:22
#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

输出的最小索引顺序不对,怎么改啊……改了一晚上了,求助

输出用的是最小表示法的输出

2023/12/10 20:22
加载中...