玄关求助(疑似死循环)
查看原帖
玄关求助(疑似死循环)
1001542
K_func楼主2025/2/6 11:51
#include <bits/stdc++.h>
using namespace std;
int n,m;
string ss[55];
int fa[55],sz[55],zx1,zx2,root;
vector<int> to[55];
void dfs(int now){
	sz[now]=1;
	int ok=1;
	for(auto i:to[now]){
		if(i==fa[now]) continue;
		dfs(i);
		sz[now]+=sz[i];
		if(sz[i]>n/2) ok=0;
	}
	if(n-sz[now]<=n/2&&ok==1){
		zx2=zx1,zx1=now;
	}
}
string ms(int now,int from){
	string s="1",tmp[55];
	int pos=0;
	for(int nxt:to[now]){
		if(nxt==from) continue;
		ms(nxt,now),tmp[++pos]=ms(nxt,now);
	}
	sort(tmp+1,tmp+1+pos);
	for(int i=1;i<=pos;i++){
		s+=tmp[i];
	}
	s+="0";
	return s;
}
int main(){
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>n;
		for(int j=1;j<=55;i++){
			to[j].resize(0,0);sz[j]=0;
		}
		for(int j=1;j<=n;j++){
			cin>>fa[j];
			if(fa[j]==0){ root=j;continue;}
			to[fa[j]].emplace_back(j);
			to[j].emplace_back(fa[j]);
		}
		dfs(1);
		ss[i]=ms(zx1,0);
		if(zx2) ss[i]=min(ss[i],ms(zx2,0));
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			if(ss[i]==ss[j]){
				cout<<j<<endl;
				break;
			}
		}
	}
	return 0;
}
2025/2/6 11:51
加载中...