提交时间:2026-04-24 16:20:15
运行 ID: 41463
#include<bits/stdc++.h> using namespace std; const int N=5050; int n,k,a[N][N]; bool tag[N][N]; bool ok[N]; int fa[N],val[N]; vector<int> gets(int u,int pa){ vector<int> res; for(int i=1;i<=n;i++){ if((a[u][i]+1)%k==a[pa][i]) res.push_back(i); }return res; } int cnt[N]; void get(int u,vector<int> subt){ //cout<<u<<endl; //for(auto ed:subt) cout<<ed<<' ';cout<<endl; //cout<<endl; vector<int> vec; for(auto ed:subt){ if(a[u][ed]==1){ vec.push_back(ed); if(ok[ed]) continue; val[ed]=0; for(int i=0;i<n;i++){ if((a[ed][i]+1)%k==a[u][i]) val[ed]++; }ok[ed]=1; } } vector<int> tmp;tmp.resize(vec.size()); memset(cnt,0,sizeof(cnt)); for(auto ed:vec) cnt[val[ed]]++; for(int i=n-1;i>=0;i--) cnt[i]+=cnt[i+1]; for(auto ed:vec) tmp[--cnt[val[ed]]]=ed; tmp.swap(vec); //sort(vec.begin(),vec.end(),[&](int x,int y){return val[x]>val[y];}); for(auto ed:vec){ if(tag[u][ed]) continue; vector<int> s=gets(ed,u); for(auto eg:s) tag[u][eg]=1;get(ed,s);fa[ed]=u; } } int main(){ //freopen("construction.in","r",stdin); //freopen("construction.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>k; for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ int x;cin>>x; a[i][j]=x;a[j][i]=x; } } vector<int> vec; for(int i=0;i<n;i++) vec.push_back(i); get(0,vec); for(int i=1;i<n;i++) cout<<fa[i]<<' '; //cerr<<cost<<endl; return 0; }