当前位置: 首页 > news >正文

图论new

边双连通分量

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n, m, cnt, ans, dfn[N], low[N]; //dfn记录dfs序,low表示这个点除树边外能连到最浅 
vector<int> mp[N], mp2[N];
vector<int> s;
void shuru() {int u, v;cin >> n >> m;for(int i = 1; i <= m; i++){cin >> u >> v;mp[u].push_back(v);mp[v].push_back(u);}
}
void dfs(int u, int f){dfn[u] = low[u] = ++cnt; //记录dfs序并初始化low int cnt = 0; //用来判重边 s.push_back(u);for(auto v : mp[u]){if(v == f && !cnt){cnt = 1; continue;	}if(!dfn[v]) dfs(v, u);low[u] = min(low[u], low[v]);//更新low }if(low[u] == dfn[u]){//把在一个连通分量的点染成一个颜色++ans; //增加一个连通分量 while(1) {int x = s.back();s.pop_back();mp2[ans].push_back(x);if(x == u) break; }		}
}
void shuchu(){cout << ans << endl;for(int i = 1; i <= ans; i++){cout << mp2[i].size() << " ";for(auto x : mp2[i]) cout << x << " ";cout << endl;}
}
int main(){shuru();for(int i = 1; i <= n; i++){if(dfn[i]) continue;dfs(i,i);}shuchu();return 0;
}

割点

#include<bits/stdc++.h>
using namespace std;
const int N = 2e4+5;
int n, m, cnt, tot, dfn[N], low[N], g[N];
vector<int> mp[N], v;
vector<int> s;
void shuru(){int u, v;cin >> n >> m;for(int i = 1; i <= m; i++){cin >> u >> v;if(u == v) continue; //特判自环 mp[u].push_back(v);mp[v].push_back(u);}
}
void dfs(int u, int f){dfn[u] = low[u] = ++cnt;for(auto v : mp[u]){if(v == f) continue;if(!dfn[v]){dfs(v, u);low[u] = min(low[u], low[v]);if(low[v] >= dfn[u]) g[u]++; //如果儿子的low比父亲还深,说明父亲是一个割点	}else low[u] = min(low[u], dfn[v]); //如果不是树边,就不会吃v==f的判断,用dfn判才不会影响判割点 }
}
int main(){shuru();for(int i = 1; i <= n; i++){if(dfn[i]) continue;dfs(i,i);g[i]--;//特判根节点 }for(int i = 1; i <= n; i++){if(g[i] > 0) v.push_back(i);}cout << v.size() << endl;for(auto x : v) cout << x << " ";return 0;
} 

点双连通分量

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n, m, cnt, ans, dfn[N], low[N];
vector<int> mp[N], mp2[N];
vector<int> s;
void shuru(){int u, v;cin >> n >> m;for(int i = 1; i <= m; i++){cin >> u >> v;if(u == v) continue;mp[u].push_back(v);mp[v].push_back(u);}
}
void dfs(int u, int f){ //本质就是找割点 if(u == f && mp[u].empty()) { //一个点也是点双连通分量,要特判 ++ans;mp2[ans].push_back(u);}dfn[u] = low[u] = ++cnt;s.push_back(u);for(auto v : mp[u]){if(v == f) continue;if(!dfn[v]){dfs(v, u);low[u] = min(low[u], low[v]);if(low[v] >= dfn[u]){ //类似于边双连通,用栈维护 ++ans;while(1){int x = s.back(); s.pop_back();mp2[ans].push_back(x);if(x == v) break; }mp2[ans].push_back(u); //要把割点本身放进去 }}else low[u] = min(low[u], dfn[v]); //类似割点特判 }
}
void shuchu(){cout << ans << endl;for(int i = 1; i <= ans; i++){cout << mp2[i].size() << " ";for(auto x : mp2[i]) cout << x << " ";cout << endl;}
}
int main(){shuru();for(int i = 1; i <= n; i++){if(dfn[i]) continue;dfs(i,i);}shuchu();return 0;
}
http://www.gsyq.cn/news/16065.html

相关文章:

  • 斜率优化dp复习笔记
  • 掌握形式验证,护航芯片安全
  • 2025橡胶软接头厂家最新企业品牌推荐排行榜,法兰橡胶软接头,可曲挠,挠性,KXT,耐油,EPDM,耐腐蚀,三元乙丙橡胶软接头,橡胶柔性软接头公司推荐!
  • 整体二分笔记
  • 基于Python+Vue开发的母婴商城管理系统源码+运行步骤
  • 机器学习Day5-模型诊断 - 详解
  • Probabilistic method小记
  • 数据生成方法初步调研
  • 深入解析:一起学Spring AI:核心概念
  • 做题记录(Oct.)
  • 生成式AI改进极端多标签分类技术
  • 实用指南:蓝桥杯_DS18B20温度传感器---新手入门级别超级详细解析
  • 越秀凭一己之力打破了行业天花板 - 智慧园区
  • 洛谷P9676 [ICPC 2022 Jinan R] Skills
  • 微信小程序(uniapp)搭建腾讯云 IM 消息撤回
  • 实用指南:苍茫命令行:linux模拟实现,书写微型bash
  • CF2149题解
  • 月球尘埃电解技术实现资源就地利用
  • 漏洞赏金计划公开后的三个阶段与应对策略
  • Python 在教育与科研中的应用与价值
  • 谈谈redis的热key问题如何解决
  • 玩转树莓派屏幕之二:自定义屏幕显示
  • 欧易OKX‌交易所注册全流程指南
  • 神秘专题训练之老题补做
  • 全球 whk 水平下降 998244353 倍,而你不变
  • 202510做题记录
  • 全球 wkh 水平下降 998244353 倍,而你不变
  • 哈希简单解说
  • 前端学习教程-VIte整合ECharts
  • Atcoder Beginner Contest 426 A-D 题解