Skip to content

Commit cc1b311

Browse files
authored
Merge pull request #1113 from AlgorithmWithGod/khj20006
[20251014] BOJ / P2 / 통행량 조사 / 권혁준
2 parents b59a8a8 + 17f9ae8 commit cc1b311

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
int N, M, cycCount = 0, E, R, r[200001]{}, ans[200001]{}, dep[200001]{}, s[200001]{}, par[200001][18]{}, cyc[200001][18]{};
6+
vector<vector<pair<int, int>>> v(200001);
7+
8+
int f(int x) {return x==r[x] ? x : r[x]=f(r[x]);}
9+
10+
int fillCycle(int n, int p, int t) {
11+
if(n == t) return cyc[n][0] = 1;
12+
for(auto [i,_]:v[n]) if(i != p) {
13+
cyc[n][0] |= fillCycle(i,n,t);
14+
}
15+
return cyc[n][0];
16+
}
17+
18+
void dfs(int n, int p, int d) {
19+
par[n][0] = p, dep[n] = d;
20+
for(auto [i,_]:v[n]) if(i != p) dfs(i,n,d+1);
21+
}
22+
23+
int cle(int n, int p) {
24+
for(auto [i,g]:v[n]) if(i != p) {
25+
s[n] += cle(i,n);
26+
if(cyc[i][0]) ans[g] += cycCount;
27+
ans[g] += s[i];
28+
}
29+
return s[n];
30+
}
31+
32+
int main(){
33+
cin.tie(0)->sync_with_stdio(0);
34+
35+
cin>>N>>M;
36+
iota(r, r+N+1, 0);
37+
for(int i=0,a,b;i<N;i++) {
38+
cin>>a>>b;
39+
int x = f(a), y = f(b);
40+
if(x == y) {
41+
fillCycle(a,0,b);
42+
E = i;
43+
R = a;
44+
}
45+
else {
46+
v[a].emplace_back(b,i);
47+
v[b].emplace_back(a,i);
48+
r[x] = y;
49+
}
50+
}
51+
52+
dfs(R,0,0);
53+
for(int k=1;k<18;k++) for(int i=1;i<=N;i++) {
54+
par[i][k] = par[par[i][k-1]][k-1];
55+
cyc[i][k] = cyc[i][k-1] + cyc[par[i][k-1]][k-1];
56+
}
57+
58+
for(int x,y,c;M--;) {
59+
cin>>x>>y>>c;
60+
int a = x, b = y;
61+
int cycSum = 0, diff = abs(dep[a]-dep[b]);
62+
for(int k=0;k<18;k++) if(diff & (1<<k)) {
63+
if(dep[a] < dep[b]) swap(a,b);
64+
cycSum += cyc[a][k];
65+
a = par[a][k];
66+
}
67+
for(int k=17;k>=0;k--) if(par[a][k] != par[b][k]) {
68+
cycSum += cyc[a][k] + cyc[b][k];
69+
a = par[a][k], b = par[b][k];
70+
}
71+
if(a != b) {
72+
cycSum += cyc[a][0] + cyc[b][0];
73+
a = par[a][0], b = par[b][0];
74+
}
75+
int lca = a;
76+
cycSum += cyc[lca][0];
77+
78+
s[x] += c;
79+
s[y] += c;
80+
if(cycSum > 1) {
81+
cycCount += c;
82+
for(int k=17;k>=0;k--) {
83+
if(!cyc[x][k]) x = par[x][k];
84+
if(!cyc[y][k]) y = par[y][k];
85+
}
86+
s[x] -= c;
87+
s[y] -= c;
88+
}
89+
else {
90+
s[lca] -= 2*c;
91+
}
92+
93+
}
94+
cle(R,0);
95+
ans[E] += cycCount;
96+
for(int i=0;i<N;i++) cout<<ans[i]<<'\n';
97+
98+
}
99+
```

0 commit comments

Comments
 (0)