题目传送门:http://hihocoder.com/problemset/problem/1192
大意:给出一棵$N$个点的树,边权为$1$,要求给每个点构造$M$个权值$v_1...v_M$,使得对于任意$i,j$,都有$dis(i,j)=\sum\limits_{i=1}^M |v_i-v_j|$。$N \leq 100$,要求构造出的答案满足$M \leq 100,-100 \leq v \leq 100$
$N \leq M$是这道题最好的构造性质
构造如下:每一次继承父亲的权值,并且将它自己的编号对应的权值变为$1$即可。易知这种构造方案符合条件
#include<bits/stdc++.h> using namespace std; struct Edge{ int end , upEd; }Ed[]; ] , N , cntEd , m[][]; ]; inline void addEd(int a , int b){ Ed[++cntEd].end = b; Ed[cntEd].upEd = head[a]; head[a] = cntEd; } void dfs(int now){ vis[now] = ; for(int i = head[now] ; i ; i = Ed[i].upEd) if(!vis[Ed[i].end]){ ; j < N ; j++) m[Ed[i].end][j] = m[now][j] + (j == Ed[i].end); dfs(Ed[i].end); } } int main(){ ios::sync_with_stdio(); cin.tie(); cout.tie(); cin >> N; ; i < N ; i++){ int a , b; cin >> a >> b; addEd(a , b); addEd(b , a); } dfs(); cout << N << endl; ; i < N ; i++){ ; j < N ; j++) cout << m[i][j] << ' '; cout << endl; } ; }