构造。
从最后一层开始往上构造。最后一层肯定都是叶子结点,距离为2的肯定是同一个父亲,确定好了父亲之后,可以确定上一层每个节点之间的距离,以及上一层每个节点到还未确定的叶子节点之间的距离。
#include<bits/stdc++.h> using namespace std; int n,m,k; vector<int>v[110]; int A[110],L[110],h[110]; int D[110][110]; int f[110]; int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%d",&A[i]); for(int i=1;i<=m;i++) { while(A[i]--) { int x; scanf("%d",&x); v[i].push_back(x); } } for(int i=1;i<=k;i++) scanf("%d",&L[i]),h[L[i]]=1; for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&D[L[i]][L[j]]); for(int i=m;i>=2;i--) { int last = 0; int now = 0; while(1) { if(now==v[i].size()) break; while(1) { if(h[v[i-1][last]]==1) last++; else break; } f[v[i][now]] = v[i-1][last]; now++; while(1) { if(now==v[i].size()) break; if(D[v[i][now]][v[i][now-1]]!=2) {last++; break;} f[v[i][now]] = v[i-1][last]; now++; } } for(int j=0;j<v[i].size();j++) for(int t=0;t<v[i].size();t++) D[f[v[i][j]]][f[v[i][t]]]=D[v[i][j]][v[i][t]]-2; for(int j=0;j<v[i].size();j++) for(int t=1;t<=k;t++) D[f[v[i][j]]][L[t]]=D[L[t]][f[v[i][j]]]=D[v[i][j]][L[t]]-1; } for(int i=1;i<=n;i++) { printf("%d",f[i]); if(i<n) printf(" "); else printf(" "); } return 0; }