Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define f first
- #define s second
- #define pb push_back
- #define mp make_pair
- #define ll long long
- #define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
- using namespace std;
- const int INF = 1e9 + 1;
- const int MAXN = 2e5 + 10;
- int tin[MAXN], a[2 * MAXN], tout[MAXN], ans[MAXN], col[MAXN], cnt[MAXN], cntCnt[MAXN];
- int n, m;
- pair <pair <int, int>, pair <int, pair <int, int> > > b[MAXN];
- int timer = 0;
- bool was[MAXN];
- vector <int> g[MAXN];
- void dfs(int v, int pr = -1){
- was[v] = 1;
- tin[v] = ++timer;
- fup[v] = tin[v];
- for (int to : g[v]){
- if (!was[to]){
- dfs(to, v);
- if (tin[v] > fup[to]){
- is_bridge(v, to);
- }
- fup[v] = min(fup[v], fup[to]);
- }
- else if (to != pr){
- fup[v] = min(fup[v], tin[to]);
- }
- }
- }
- void dfs(int v, int pr = -1){
- was[v] = 1;
- tin[v] = ++timer;
- fup[v] = tin[v];
- int child = 0;
- for (int to : g[v]){
- if (!was[to]){
- child++;
- dfs(to, v);
- if (tin[v] >= fup[to] && pr != -1){
- is_point(v);
- }
- fup[v] = min(fup[v], fup[to]);
- }
- else if (to != pr){
- fup[v] = min(fup[v], tin[to]);
- }
- }
- if (pr == -1 && child > 1){
- is_point(v);
- }
- }
- void solve(){
- int n, m;
- cin >> n >> m;
- for (int i = 1; i <= m; i++){
- int x, y;
- cin >> x >> y;
- g[x].pb(y);
- g[y].pb(x);
- }
- for (int i = 1; i <= n; i++){
- if (!was[i]){
- dfs(i, -1);
- }
- }
- }
- int main() {
- IOS;
- //freopen("rmq.in", "r", stdin);
- //freopen("rmq.out", "w", stdout);
- int t = 1;
- // cin >> t;
- while(t--){
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment