紅紅和藍藍是隨機降生在蘋果樹上的蘋果仙靈,現在紅線仙想估測他們的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+1ndistance(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...