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其所在的另...