Skip to content

Commit 77612e6

Browse files
authored
[20251122] BOJ / P2 / MST의 기댓값 / 권혁준
1 parent e5d64fa commit 77612e6

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
using ll = long long;
5+
6+
const ll MOD = 1e9 + 7;
7+
8+
int N, M;
9+
vector<tuple<int, int, int>> edges;
10+
map<ll, ll> events;
11+
vector<int> root;
12+
vector<ll> cost;
13+
ll X = 0, P = 0;
14+
15+
ll power(ll a, ll b) {
16+
if(b == 0) return 1;
17+
if(b == 1) return a % MOD;
18+
ll h = power(a, b>>1) % MOD;
19+
h = (h * h) % MOD;
20+
return (b&1) ? h * a % MOD : h;
21+
}
22+
23+
ll g(ll x) { return x*(x+1)%MOD*power(2,MOD-2)%MOD; }
24+
ll h(ll x) { return x*(x+1)%MOD*(2*x+1)%MOD*power(6,MOD-2)%MOD; }
25+
26+
int find(int x) { return x == root[x] ? x : root[x] = find(root[x]); }
27+
28+
int main(){
29+
cin.tie(0)->sync_with_stdio(0);
30+
31+
cin>>N>>M;
32+
P = power((1000000001LL * N % MOD * (N-1) % MOD * power(2, MOD-2) % MOD), MOD-2);
33+
for(int a,b,c;M--;) {
34+
cin>>a>>b>>c;
35+
edges.emplace_back(c,a,b);
36+
}
37+
38+
root.resize(N+1);
39+
cost.resize(N+1);
40+
iota(root.begin(), root.end(), 0);
41+
fill(cost.begin(), cost.end(), 1);
42+
cost[0] = 0;
43+
44+
sort(edges.begin(), edges.end());
45+
46+
for(auto [c,a,b] : edges) {
47+
int x = find(a), y = find(b);
48+
if(x == y) continue;
49+
events[c] = (events[c] + cost[x]*cost[y]) % MOD;
50+
events[0] = (events[0] + (cost[x]*cost[y] % MOD * (1000000001 - c) % MOD)) % MOD;
51+
cost[y] += cost[x];
52+
root[x] = y;
53+
X += c;
54+
}
55+
56+
ll C = 0, ans = 0, D = 0;
57+
for(auto it = events.rbegin();it != events.rend();) {
58+
// cur - i
59+
// C + it->second
60+
ll k = it->second;
61+
D = (D + k) % MOD;
62+
C = (C + D) % MOD;
63+
if(it->first == 0) {
64+
ans = (ans + (C * X % MOD)) % MOD;
65+
break;
66+
}
67+
ll s = it->first;
68+
ll e = (++it)->first;
69+
ll cnt = s - e - 1;
70+
71+
ll cur = (X - s) % MOD;
72+
ll _1 = cur * C % MOD * (cnt + 1) % MOD;
73+
ll _2 = cur * D % MOD * g(cnt) % MOD;
74+
ll _3 = C * g(cnt) % MOD;
75+
ll _4 = D * h(cnt) % MOD;
76+
ans = (ans + (_1 + _2 + _3 + _4)) % MOD;
77+
// cout<<"1 : "<<_1<<'\t';
78+
// cout<<"2 : "<<_2<<'\t';
79+
// cout<<"3 : "<<_3<<'\t';
80+
// cout<<"4 : "<<_4<<'\n';
81+
C = (C + D * cnt) % MOD;
82+
}
83+
cout<<ans * P % MOD;
84+
85+
}
86+
```

0 commit comments

Comments
 (0)