51Nod 1405 樹的距離之和

2021-07-22 18:21:03 字數 1603 閱讀 3609

acm模版

根據題意,這是一顆樹,所以每兩點之間的路徑一定是唯一的。這裡讓求所有點到第i個結點的距離和,其實也就是其他所有結點到第i個結點的距離和。

通過觀察發現,只要我們找到了乙個點對應的結果,那麼其他所有的點都可以通過這個結果擴充套件出來,利用邊的關係。比如說,我們知道了第乙個結點對應的結果,並且知道第乙個和第二個存在連邊,那麼一定可以通過第乙個的結果求得第二個結果……以此類推。

所以,我們先dfs,求第乙個結點的對應結果(當做根,也可以是別的結點當做根),並且儲存該樹每個枝杈上的後代數目(包括其本身),這個資料對求其他結果至關重要,接著我們再通過第二個dfs擴充套件出其他結果即可。

另外附乙份樹歸的解法(two)……

one:

#include 

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn = 1e5 + 5;

int n;

ll res[maxn];

int des[maxn];

vector

node[maxn];

void dfs(int lastpos, int pos, int power)

}return ;

}void dfs_(int lastpos, int pos)

}return ;

}int main(int argc, const

char * argv)

res[1] = node[1].size();

for (int i = 1; i <= n; i++)

dfs(0, 1, 2);

dfs_(0, 1);

for (int i = 1; i <= n; i++)

return

0;}

two:

#include 

#include

#include

#define maxn 100009

using

namespace

std;

typedef

struct

point;

point p[2 * maxn];

typedef

struct

r;r r;

int dis[maxn];

long

long dp[2 * maxn][2];

void dfs(int a, int last)

else}}

r.n = count + 1;

r.w = ans;

return ;

}int main ()

for (int i = 1, sz = n + 1; i < sz; i++)

return

0;}

51nod 1405 樹的距離之和

給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...

51nod 1405 樹的距離之和

給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...

51nod 1405 樹的距離之和

思路 可以先隨便選取節點1作為樹的根節點,然後從根節點遍歷樹,每次儲存k節點的子節點總數 d k s 以及所有子節點都k節點的距離和 d k sum,在遍歷過程就可完成儲存。然後再從根節點遍歷一遍樹,求所有點到k節點的距離,就可以轉換成求k節點的子節點到k節點的距離s1和k節點的頭節點id其所在的另...