Skip to content

Commit 89a0858

Browse files
committed
add: 桥
1 parent 0b65f27 commit 89a0858

File tree

4 files changed

+93
-78
lines changed

4 files changed

+93
-78
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@
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

graph theory/Tarjan2.cpp

Lines changed: 13 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,14 @@
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
}

graph theory/Tarjan3.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,35 @@
1-
int dfn[MAXN], low[MAXN], tt = 0;
1+
int dfn[MAXN], low[MAXN], idx = 0;
22
stack<int> st;
3-
map<PII, bool> vis;
4-
53
vector<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

3235
void 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";

graph theory/Tarjan4.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
}

0 commit comments

Comments
 (0)