HihoCoder1192 简单的树嵌入 dfs、构造

时间:2023-11-21 09:29:32

题目传送门: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;
     }
     ;
 }