File tree Expand file tree Collapse file tree 4 files changed +93
-78
lines changed
Expand file tree Collapse file tree 4 files changed +93
-78
lines changed Original file line number Diff line number Diff line change 4848+ 树上差分 (Difference On Tree.cpp)
4949+ 连通性相关
5050 + 割点 (Tarjan1.cpp)
51- + 点双连通分量 (Tarjan2.cpp)
52- + 边双连通分量 (Tarjan3.cpp)
51+ + 割边 (Tarjan2.cpp)
52+ + 点双连通分量 (Tarjan3.cpp)
53+ + 边双连通分量 (Tarjan4.cpp)
5354
5455## 杂项 various
5556
Original file line number Diff line number Diff line change 1- int dfn[MAXN], low[MAXN], idx = 0 ;
2- stack<int > st;
3- vector<vector<int >> ans;
4-
5- void tarjan (int u, bool is_root) {
6- dfn[u] = low[u] = ++idx;
7- st.push (u);
8- if (is_root && g[u].size () == 0 ) {
9- vector<int > res;
10- res.push_back (u);
11- ans.push_back (res);
12- return ;
13- }
14- for (auto v : g[u]) {
15- if (!dfn[v]) {
16- tarjan (v, 0 );
17- low[u] = min (low[u], low[v]);
18- if (low[v] >= dfn[u]) {
19- vector<int > res;
20- int w;
21- do {
22- w = st.top ();
23- st.pop ();
24- res.push_back (w);
25- }while (w != v);
26- res.push_back (u);
27- ans.push_back (res);
28- }
29- } else {
30- low[u] = min (low[u], dfn[v]);
31- }
32- }
33- }
34-
35- void solve () {
36- cin >> n >> m;
37- for (int i = 1 ; i <= m; ++i) {
38- int u, v;
39- cin >> u >> v;
40- if (u == v) continue ;
41- g[u].push_back (v);
42- g[v].push_back (u);
43- }
44-
45- for (int i = 1 ; i <= n; ++i) {
46- if (!dfn[i]) tarjan (i, 1 );
47- }
48-
49- cout << ans.size () << " \n " ;
50- for (auto i : ans) {
51- cout << i.size () << " " ;
52- for (auto j : i) cout << j << " " ;
53- cout << " \n " ;
54- }
1+ void tarjan (int x, int in_edge) {
2+ dfn[x] = low[x] = ++num;
3+ for (int i = head[x]; i; i = Next[i]) {
4+ int y = ver[i];
5+ if (!dfn[y]) {
6+ tarjan (y, i);
7+ low[x] = min (low[x], low[y]);
8+ if (low[y] > dfn[x])
9+ bridge[i] = bridge[i ^ 1 ] = true ;
10+ }
11+ else if (i != (in_edge ^ 1 ))
12+ low[x] = min (low[x], dfn[y]);
13+ }
5514}
Original file line number Diff line number Diff line change 1- int dfn[MAXN], low[MAXN], tt = 0 ;
1+ int dfn[MAXN], low[MAXN], idx = 0 ;
22stack<int > st;
3- map<PII, bool > vis;
4-
53vector<vector<int >> ans;
64
7- void tarjan (int u, int f ) {
8- dfn[u] = low[u] = ++tt ;
5+ void tarjan (int u, bool is_root ) {
6+ dfn[u] = low[u] = ++idx ;
97 st.push (u);
10- for (auto [v, id] : g1[u]) {
11- if (id == (f ^ 1 )) continue ;
8+ if (is_root && g[u].size () == 0 ) {
9+ vector<int > res;
10+ res.push_back (u);
11+ ans.push_back (res);
12+ return ;
13+ }
14+ for (auto v : g[u]) {
1215 if (!dfn[v]) {
13- tarjan (v, id );
16+ tarjan (v, 0 );
1417 low[u] = min (low[u], low[v]);
18+ if (low[v] >= dfn[u]) {
19+ vector<int > res;
20+ int w;
21+ do {
22+ w = st.top ();
23+ st.pop ();
24+ res.push_back (w);
25+ }while (w != v);
26+ res.push_back (u);
27+ ans.push_back (res);
28+ }
1529 } else {
1630 low[u] = min (low[u], dfn[v]);
1731 }
1832 }
19-
20- if (dfn[u] == low[u]) {
21- vector<int > res;
22- res.push_back (u);
23- while (st.size () && st.top () != u) {
24- res.push_back (st.top ());
25- st.pop ();
26- }
27- st.pop ();
28- ans.push_back (res);
29- }
3033}
3134
3235void solve () {
@@ -35,12 +38,12 @@ void solve () {
3538 int u, v;
3639 cin >> u >> v;
3740 if (u == v) continue ;
38- g1 [u].push_back ({v, i << 1 } );
39- g1 [v].push_back ({u, i << 1 | 1 } );
41+ g [u].push_back (v );
42+ g [v].push_back (u );
4043 }
4144
4245 for (int i = 1 ; i <= n; ++i) {
43- if (!dfn[i]) tarjan (i, 0 );
46+ if (!dfn[i]) tarjan (i, 1 );
4447 }
4548
4649 cout << ans.size () << " \n " ;
Original file line number Diff line number Diff line change 1+ int dfn[MAXN], low[MAXN], tt = 0 ;
2+ stack<int > st;
3+ map<PII, bool > vis;
4+
5+ vector<vector<int >> ans;
6+
7+ void tarjan (int u, int f) {
8+ dfn[u] = low[u] = ++tt;
9+ st.push (u);
10+ for (auto [v, id] : g1[u]) {
11+ if (id == (f ^ 1 )) continue ;
12+ if (!dfn[v]) {
13+ tarjan (v, id);
14+ low[u] = min (low[u], low[v]);
15+ } else {
16+ low[u] = min (low[u], dfn[v]);
17+ }
18+ }
19+
20+ if (dfn[u] == low[u]) {
21+ vector<int > res;
22+ res.push_back (u);
23+ while (st.size () && st.top () != u) {
24+ res.push_back (st.top ());
25+ st.pop ();
26+ }
27+ st.pop ();
28+ ans.push_back (res);
29+ }
30+ }
31+
32+ void solve () {
33+ cin >> n >> m;
34+ for (int i = 1 ; i <= m; ++i) {
35+ int u, v;
36+ cin >> u >> v;
37+ if (u == v) continue ;
38+ g1[u].push_back ({v, i << 1 });
39+ g1[v].push_back ({u, i << 1 | 1 });
40+ }
41+
42+ for (int i = 1 ; i <= n; ++i) {
43+ if (!dfn[i]) tarjan (i, 0 );
44+ }
45+
46+ cout << ans.size () << " \n " ;
47+ for (auto i : ans) {
48+ cout << i.size () << " " ;
49+ for (auto j : i) cout << j << " " ;
50+ cout << " \n " ;
51+ }
52+ }
You can’t perform that action at this time.
0 commit comments