#include<bits/stdc++.h>
using namespace std;
const int T=21,R=3,S=3;
mt19937 rng(556366);
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t,ss=0; cin>>t;
vector<vector<vector<int> > > G(t);
for(auto &g:G){
int n; cin>>n;
ss+=n*n,g.resize(n);
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
g[--u].emplace_back(--v);
g[v].emplace_back(u);
}
}
for(auto &g:G){
int n=g.size();
vector<int> fr(n-2,n);
auto prufer=[&](vector<int> &p){
vector<int> q(n),f(n,-1),d(n),pr;
for(int i=0;i<n;i++)
q[p[i]]=i;
auto dfs=[&](auto &&self,int u)->void{
for(int i:g[q[u]])
if(p[i]!=f[u])d[f[p[i]]=u]++,self(self,p[i]);
};
dfs(dfs,n-1);
int pt=0;
while(pr.size()<n-2){
while(d[pt])pt++;
pr.emplace_back(f[pt++]);
while(pr.size()<n-2&&
!--d[pr.back()]&&pr.back()<pt)
pr.emplace_back(f[pr.back()]);
}
return pr;
};
double tm=1.0*T*(n*n)/ss;
for(int r=0;r<R;r++){
double tmr=tm/R;
int st=clock();
vector<int> p(n);
iota(p.begin(),p.end(),0);
shuffle(p.begin(),p.end(),rng);
auto cr=prufer(p);
while(1.0*(clock()-st)/CLOCKS_PER_SEC<tmr){
auto op=p;
for(int i=0;i<S;i++){
int x=rng()%n,y=rng()%n;
swap(p[x],p[y]);
}
auto nr=prufer(p);
if(nr<cr)cr=nr;
else p=move(op);
}
fr=min(fr,cr);
}
for(int i:fr)cout<<i+1<<' ';
cout<<'\n';
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<bits/stdc++.h> using namespace std; const int T=21,R=3,S=3; mt19937 rng(556366); int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t,ss=0; cin>>t; vector<vector<vector<int> > > G(t); for(auto &g:G){ int n; cin>>n; ss+=n*n,g.resize(n); for(int i=1;i<n;i++){ int u,v; cin>>u>>v; g[--u].emplace_back(--v); g[v].emplace_back(u); } } for(auto &g:G){ int n=g.size(); vector<int> fr(n-2,n); auto prufer=[&](vector<int> &p){ vector<int> q(n),f(n,-1),d(n),pr; for(int i=0;i<n;i++) q[p[i]]=i; auto dfs=[&](auto &&self,int u)->void{ for(int i:g[q[u]]) if(p[i]!=f[u])d[f[p[i]]=u]++,self(self,p[i]); }; dfs(dfs,n-1); int pt=0; while(pr.size()<n-2){ while(d[pt])pt++; pr.emplace_back(f[pt++]); while(pr.size()<n-2&& !--d[pr.back()]&&pr.back()<pt) pr.emplace_back(f[pr.back()]); } return pr; }; double tm=1.0*T*(n*n)/ss; for(int r=0;r<R;r++){ double tmr=tm/R; int st=clock(); vector<int> p(n); iota(p.begin(),p.end(),0); shuffle(p.begin(),p.end(),rng); auto cr=prufer(p); while(1.0*(clock()-st)/CLOCKS_PER_SEC<tmr){ auto op=p; for(int i=0;i<S;i++){ int x=rng()%n,y=rng()%n; swap(p[x],p[y]); } auto nr=prufer(p); if(nr<cr)cr=nr; else p=move(op); } fr=min(fr,cr); } for(int i:fr)cout<<i+1<<' '; cout<<'\n'; } return 0; } |
English