標籤:hoc 16px bool i++ line 繼承 main oid mes
題目傳送門: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$即可。易知這種構造方案符合條件
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct Edge{ 5 int end , upEd; 6 }Ed[201]; 7 int head[101] , N , cntEd , m[101][101]; 8 bool vis[101]; 9 10 inline void addEd(int a , int b){11 Ed[++cntEd].end = b;12 Ed[cntEd].upEd = head[a];13 head[a] = cntEd;14 }15 16 void dfs(int now){17 vis[now] = 1;18 for(int i = head[now] ; i ; i = Ed[i].upEd)19 if(!vis[Ed[i].end]){20 for(int j = 0 ; j < N ; j++)21 m[Ed[i].end][j] = m[now][j] + (j == Ed[i].end);22 dfs(Ed[i].end);23 }24 }25 26 int main(){27 ios::sync_with_stdio(0);28 cin.tie(0);29 cout.tie(0);30 cin >> N;31 for(int i = 1 ; i < N ; i++){32 int a , b;33 cin >> a >> b;34 addEd(a , b);35 addEd(b , a);36 }37 dfs(0);38 cout << N << endl;39 for(int i = 0 ; i < N ; i++){40 for(int j = 0 ; j < N ; j++)41 cout << m[i][j] << ‘ ‘;42 cout << endl;43 }44 return 0;45 }
HihoCoder1192 簡單的樹嵌入 dfs、構造