1405 樹的距離之和
基準時間限制:1 秒 空間限制:131072 kb
給定一棵無根樹,假設它有n個節點,節點編號從1到n, 求任意兩點之間的距離(最短路徑)之和。
input
第一行包含乙個正整數n (n <= 100000),表示節點個數。output後面(n - 1)行,每行兩個整數表示樹的邊。
每行乙個整數,第i(i = 1,2,...n)行表示所有節點到第i個點的距離之和。input示例
4output示例1 23 2
4 2
5355思路:dfs
先選乙個根節點,然後dfs求出所有點到這個點的距離最小值之和,過程中d記錄當前點下所有子節點到這個點的最小距離之和,node
記錄當前的點有多少個子節點,包括本身。然後這樣根節點的答案就有了,然後他的子節點可以根據根節點來更新的得到,d[n]+=d[m]-(d[n]+node[n])+node[m]-node[n];
然後dfs一遍就可以更新了。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include
8 #include9 #include10
using
namespace
std;
11 typedef long
long
ll;12 vectorvec[100005
];13 ll d[100005
];14 ll node[100005
];15
bool flag[1000005
];16
void dfs(int
n);17
void slove(int
n);18
int main(void)19
31 memset(flag,0,sizeof
(flag));
32 memset(d,0,sizeof
(d));
33 dfs(1
);34 memset(flag,0,sizeof
(flag));
35 slove(1
);36
for(i = 1; i <= n; i++)
37 printf("
%lld\n
",d[i]);
38return0;
39}40void dfs(int
n)4155}
56}57void slove(int
n)5872}
73 }
51nod 1405 樹的距離之和
給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...
51Nod 1405 樹的距離之和
acm模版 根據題意,這是一顆樹,所以每兩點之間的路徑一定是唯一的。這裡讓求所有點到第i個結點的距離和,其實也就是其他所有結點到第i個結點的距離和。通過觀察發現,只要我們找到了乙個點對應的結果,那麼其他所有的點都可以通過這個結果擴充套件出來,利用邊的關係。比如說,我們知道了第乙個結點對應的結果,並且...
51nod 1405 樹的距離之和
給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...