樹中所有點距離之和

2021-10-25 06:45:27 字數 1289 閱讀 7470

紅紅和藍藍是隨機降生在蘋果樹上的蘋果仙靈,現在紅線仙想估測他們的cp係數,並決定是否使他們成為一對cp。

給出n個結點n-1條邊的樹,節點編號為1到n,定義distance(i,j)為i與j的樹上距離。

cp係數是指所有紅紅和藍藍在不同位置i,j的distance(i,j)之和。

即 ∑i=1n−1∑j=i+1ndistance(i,j)\sum_^^}∑i=1n−1​∑j=i+1n​distance(i,j)。

求紅紅和藍藍的cp係數,對109+7取模。

第一行乙個整數n( 1 < n <= 105 ),表示樹的結點個數。

隨後n-1行,每行三個整數a,b,c ( 1 <= a,b <= n ),( 0 <= c <= 109 ),表示結點a,b之間有一條權值為c的邊,( a ≠\ne​= b )。

一行乙個整數,表示cp係數對10
+7取模的結果。
示例1

複製

4

1 2 1

2 3 1

2 4 1

複製

9
樹形動態規劃:

num[rt]: rt子樹有多少節點

sum[rt]: rt子樹中所有子節點到rt的距離之和

ans:  所有這樣的點(i,j)【i,j不在同一條直線上】距離之和

// sun[rt] 那麼也可以表示為在同一直線上兩點之和

*/#include

using namespace std;

const int n=1e5+7;

const int mod=1e9+7;

typedef long long ll;

struct node ;

vector g[n];

ll num[n], sum[n];

bool vis[n];

int n; ll ans;

void dfs (int rt)

}num[rt]+=1;

//printf("rt: %d num: %lld sum: %lld ans: %lld\n",rt, num[rt], sum[rt], ans);

}int main ()

; g[u].push_back(tmp);

tmp.id=u;          g[v].push_back(tmp);

}dfs(1);

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

ans=(ans+sum[i])%mod;

printf("%lld\n",ans);

return 0;

}

集合中所有子集元素之和

題目 給乙個集合array,包含n個數。規定集合的 值 為集合中所有元素的和。求該集合的所有子集的值的和。示例 陣列 1,2 它的子集有空集,1 2 1,2 子集各自的值為0,1,2,3 所以子集值的和為0 1 2 3 6 解法一 思路 簡單暴力的方法就是窮舉陣列所有的子集,然後逐個求子集的值,然後...

乙個退火演算法求點到所有點的距離之和最小

題意 給定n個點,在範圍內找到x軸上的乙個點,使得n個點到這個點的距離之和最小 模擬退火法 模擬退火的過程 1 找到這些點所在的範圍,用兩個點框定 2 在這個範圍內生成num個點 num自定 3 對於每個生成的點i,在其周圍生成num個點,一旦有點優於i,則替換。4 縮小範圍d,若d 精度,退出,否...

834 樹中距離之和

給定乙個無向 連通的樹。樹中有 n 個標記為 0.n 1 的節點以及 n 1 條邊 第 i 條邊連線節點 edges i 0 和 edges i 1 返回乙個表示節點 i 與其他所有節點距離之和的列表 ans。示例 1 輸入 n 6,edges 0,1 0,2 2,3 2,4 2,5 輸出 8,12...