#include <bits/stdc++.h>
int T,N,hd[1009],to[2009],nxt[2009],k,aa[1009],as[1009],
as2[1009],dg[1009],vq[1009],cl[1009],tt,xx,cq,v2[1009],tx[1009],v3[1009];
void l(int u,int v) {
to[++k]=v;nxt[k]=hd[u];hd[u]=k;
}
void dfs() {
int ct=0;
for(int i=1;i<=tt;i++) {
ct+=v2[i];
}
if(ct==tt-1) {
for(int j=1;j<N;j++) {
if(as2[j]!=as[j]) {
if(as2[j]<as[j]) break;
for(int k=1;k<N;k++) as2[k]=as[k];
break;
}
}
return;
}
for(int j=1;j<=xx;j++) {
if(as2[j]!=as[j]) {
if(as2[j]<as[j]) return;
for(int k=1;k<=xx;k++) as2[k]=as[k];
for(int k=xx+1;k<N;k++) as2[k]=N;
break;
}
}
int id=0;
for(int i=1;i<=tt;i++) {
if(v2[i]) continue;
if(cl[tx[i]]) {
id=i;
break;
}
}
int f1=N+1,f2=0;
std::vector<int> ix;
int f3=0;
std::vector<int> ix2;
if(id==0&&ct<=tt-2) {
for(int i=1;i<=N;i++) {
if(vq[i]==0) continue;
if(v3[i]) continue;
int c1=0,c2=0,tq=0,tc=0;
for(int j=hd[i];j;j=nxt[j]) {
if(vq[to[j]]==0) continue;
if(v3[to[j]]) {
c1++;
tc=v3[to[j]];
} else {
c2++;
tq=cl[to[j]];
}
}
if(c1==0) continue;
if(c2==0) {
ix.push_back(tc);
break;
}
if(c2>1) tq=0;
// if(c2!=1) continue;
if(tq!=0) {
if(f1>c1) {
f1=c1;
f2=tq;
ix.clear();
ix.push_back(tc);
} else if(f1==c1&&f2>tq) {
f2=tq;
ix.clear();
ix.push_back(tc);
} else if(f1==c1&&f2==tq) {
ix.push_back(tc);
}
} else {
if(f3<c1) {
f3=c1;
ix2.clear();
ix2.push_back(tc);
} else if(f3==c1) {
ix2.push_back(tc);
}
}
}
if(ix.empty()) ix=ix2;
} else if(id==0) {
for(int i=1;i<=tt;i++) {
if(v2[i]) continue;
ix.push_back(i);
}
} else ix.push_back(id);
for(int ii=0;ii<ix.size();ii++) {
int i=ix[ii];
// if(ct==0) printf("!! %d\n",i);
if(v2[i]) assert(0);
int x=aa[i];
if(id&&x!=aa[id]) assert(0);
std::vector<int> a1,a2,a3;
vq[x]=0;
a3.push_back(x);
while(x!=-1) {
//assert(dg[x]==1);
for(int j=hd[x];j;j=nxt[j]) {
if(vq[to[j]]) {
a1.push_back(to[j]);
if(cl[to[j]]==0) {
a2.push_back(to[j]);
cl[to[j]]=++cq;
}
as[++xx]=cl[to[j]];
dg[to[j]]--;
if(dg[to[j]]==1) {
x=to[j];
vq[x]=0;
a3.push_back(x);
} else {
x=-1;
}
break;
}
}
}
v2[i]=1;
dfs();
v2[i]=0;
for(int i=0;i<a1.size();i++) {
dg[a1[i]]++;
xx--;
}
for(int i=0;i<a2.size();i++) {
cl[a2[i]]=0;
cq--;
}
for(int i=0;i<a3.size();i++) {
vq[a3[i]]=1;
}
}
}
signed main(void) {
scanf("%d",&T);
while(T--) {
scanf("%d",&N);
for(int i=1;i<=N;i++) hd[i]=dg[i]=0;k=0;
tt=0;xx=0;cq=0;
for(int i=1;i<N;i++) {
int u,v;
scanf("%d %d",&u,&v);
l(u,v),l(v,u);
dg[u]++;dg[v]++;
}
for(int i=1;i<=N;i++) {
if(dg[i]==1) {
aa[++tt]=i;
v3[i]=tt;
tx[tt]=to[hd[i]];
v2[tt]=0;
} else v3[i]=0;
vq[i]=1;cl[i]=0;
as2[i]=N;
}
dfs();
for(int i=1;i<=N-2;i++) {
// assert(as2[i]<N);
printf("%d ",as2[i]);
}
printf("\n");
}
}
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | #include <bits/stdc++.h> int T,N,hd[1009],to[2009],nxt[2009],k,aa[1009],as[1009], as2[1009],dg[1009],vq[1009],cl[1009],tt,xx,cq,v2[1009],tx[1009],v3[1009]; void l(int u,int v) { to[++k]=v;nxt[k]=hd[u];hd[u]=k; } void dfs() { int ct=0; for(int i=1;i<=tt;i++) { ct+=v2[i]; } if(ct==tt-1) { for(int j=1;j<N;j++) { if(as2[j]!=as[j]) { if(as2[j]<as[j]) break; for(int k=1;k<N;k++) as2[k]=as[k]; break; } } return; } for(int j=1;j<=xx;j++) { if(as2[j]!=as[j]) { if(as2[j]<as[j]) return; for(int k=1;k<=xx;k++) as2[k]=as[k]; for(int k=xx+1;k<N;k++) as2[k]=N; break; } } int id=0; for(int i=1;i<=tt;i++) { if(v2[i]) continue; if(cl[tx[i]]) { id=i; break; } } int f1=N+1,f2=0; std::vector<int> ix; int f3=0; std::vector<int> ix2; if(id==0&&ct<=tt-2) { for(int i=1;i<=N;i++) { if(vq[i]==0) continue; if(v3[i]) continue; int c1=0,c2=0,tq=0,tc=0; for(int j=hd[i];j;j=nxt[j]) { if(vq[to[j]]==0) continue; if(v3[to[j]]) { c1++; tc=v3[to[j]]; } else { c2++; tq=cl[to[j]]; } } if(c1==0) continue; if(c2==0) { ix.push_back(tc); break; } if(c2>1) tq=0; // if(c2!=1) continue; if(tq!=0) { if(f1>c1) { f1=c1; f2=tq; ix.clear(); ix.push_back(tc); } else if(f1==c1&&f2>tq) { f2=tq; ix.clear(); ix.push_back(tc); } else if(f1==c1&&f2==tq) { ix.push_back(tc); } } else { if(f3<c1) { f3=c1; ix2.clear(); ix2.push_back(tc); } else if(f3==c1) { ix2.push_back(tc); } } } if(ix.empty()) ix=ix2; } else if(id==0) { for(int i=1;i<=tt;i++) { if(v2[i]) continue; ix.push_back(i); } } else ix.push_back(id); for(int ii=0;ii<ix.size();ii++) { int i=ix[ii]; // if(ct==0) printf("!! %d\n",i); if(v2[i]) assert(0); int x=aa[i]; if(id&&x!=aa[id]) assert(0); std::vector<int> a1,a2,a3; vq[x]=0; a3.push_back(x); while(x!=-1) { //assert(dg[x]==1); for(int j=hd[x];j;j=nxt[j]) { if(vq[to[j]]) { a1.push_back(to[j]); if(cl[to[j]]==0) { a2.push_back(to[j]); cl[to[j]]=++cq; } as[++xx]=cl[to[j]]; dg[to[j]]--; if(dg[to[j]]==1) { x=to[j]; vq[x]=0; a3.push_back(x); } else { x=-1; } break; } } } v2[i]=1; dfs(); v2[i]=0; for(int i=0;i<a1.size();i++) { dg[a1[i]]++; xx--; } for(int i=0;i<a2.size();i++) { cl[a2[i]]=0; cq--; } for(int i=0;i<a3.size();i++) { vq[a3[i]]=1; } } } signed main(void) { scanf("%d",&T); while(T--) { scanf("%d",&N); for(int i=1;i<=N;i++) hd[i]=dg[i]=0;k=0; tt=0;xx=0;cq=0; for(int i=1;i<N;i++) { int u,v; scanf("%d %d",&u,&v); l(u,v),l(v,u); dg[u]++;dg[v]++; } for(int i=1;i<=N;i++) { if(dg[i]==1) { aa[++tt]=i; v3[i]=tt; tx[tt]=to[hd[i]]; v2[tt]=0; } else v3[i]=0; vq[i]=1;cl[i]=0; as2[i]=N; } dfs(); for(int i=1;i<=N-2;i++) { // assert(as2[i]<N); printf("%d ",as2[i]); } printf("\n"); } } |
English