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

二分图、拓扑与欧拉

1、二分图匹配问题(判断是否二分图可以使用并查集)
`// 邻接表存储图
int n1, n2, m;
int h[500], e[100010],ne[100010], idx = 0;
//st 标记是否递归找过, match[x]:和 x 编号的男生的编号
int st[510], match[510];
//存图函数
void add(int a, int b){
e[idx] = b, ne[idx] = h[a]; h[a] = idx++;
}
//递归找可以匹配的点
bool find(int x){
// 和各个点尝试能否匹配
for(int i = h[x]; i != -1; i = ne[i]){
int b = e[i];
if(!st[b]){//打标记
st[b] = 1;
// 当前尝试点没有被匹配或者和当前尝试点匹配的那个点可以换另一个匹配
if(match[b] == 0 || find(match[b])){
// 和当前尝试点匹配在一起
match[b] = x;
return true;
}
}
}
return false;
}

int main(){
memset(h, -1, sizeof h);
cin >> n1 >> n2 >> m;
// 保存图,因为只从一遍找另一边,所以该无向图只需要存储一个方向
for(int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
add(a, b);
}
int res = 0;
//为各个点找匹配
for(int i = 1; i <= n1; i++){
memset(st, 0, sizeof st);
//找到匹配
if(find(i)) res++;
}
cout << res;
return 0;
}`

2、拓扑排序(核心在出度和入度,相当于bfs思路,常用于有多重先后顺序的点排列)(下面的例题用于求取所有起点出发到所有终点的总路径,拓扑在此并非用于‘求’排列,而是‘维护’题意的排列并求路径)
`const int MOD = 80112002;
int n, m; // n: 节点数, m: 边数
int rudu[5010];int chudu[5010];// 每个点的出度入度
int sg[5010]; // 标记数组,记录是否已入队
int dp[5010]; // dp[i]: 从任意起点到达i的路径数
int ans = 0;

// cb[x]: 从x出发的所有“反向边”目标(即图的反向边存储)
// rb[x]: 正向边的邻接表(可选)
unordered_map<int, vector> cb;
unordered_map<int, vector> rb;

void tppx() {
queue q;
for (int i = 1; i <= n; i++) {
if (rudu[i] == 0) {
q.push(i);// 初始化:所有入度为0的点是起点
dp[i] = 1;// 起点到自身路径数 = 1
sg[i] = 1;
}
}

// BFS式拓扑排序
while (!q.empty()) {int up = q.front(); q.pop();// 遍历up的所有后继节点(反向存储时要注意方向)for (int i = 0; i < cb[up].size(); i++) {int v = cb[up][i];rudu[v]--;  // 消去一条入度// 动态规划转移:dp[v] += dp[up]dp[v] = (dp[v] + dp[up]) % MOD;}for (int i = 1; i <= n; i++) {if (rudu[i] == 0 && !sg[i]) {q.push(i);sg[i] = 1;// 入度归0的点入队}}
}//如果要判断可否拓扑排序,这里可以加一个if,判断是否所有点sg都记录为已经入队过

}

int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int A, B; cin >> A >> B;
// 注意这里边是 B -> A (存反向图) 因为作者的dp计算方向是反向的
rudu[A]++; // A 的入度 +1
cb[B].push_back(A); // 记录反向边 B -> A
rb[A].push_back(B); // 记录正向边 A -> B
chudu[B]++; // B 的出度 +1
}

tppx();
for (int i = 1; i <= n; i++) {if (chudu[i] == 0) {ans = (ans + dp[i]) % MOD;// 所有出度为0的节点都是“终点”,记录到它们的所有路径}
}cout << ans << endl;
return 0;

}`

http://www.zskr.cn/news/21820.html

相关文章:

  • 每日笔记
  • 实用指南:2025年9月个人工作生活总结
  • 别再用均值填充了!MICE算法教你正确处理缺失数据
  • nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/申威SW64架构)
  • 感知节点@5@ ESP32+arduino+ 第三个程序FreeRTOS 上 LED灯显示 和 串口打印ASCII表
  • BIG-Bench:大规模语言模型能力的全面评估与挑战 - 详解
  • OAuth/OpenID Connect 渗透测试完全指南
  • Problem K. 置换环(The ICPC online 2025)思路解析 - tsunchi
  • Go 语言和 Tesseract OCR 识别英文数字验证码
  • 2025年10月小程序开发公司最新推荐排行榜,小程序定制开发,电商小程序开发,预订服务小程序开发,活动报名小程序开发!
  • C语言学习——键盘录入
  • 第十五篇
  • Erlang 的英文数字验证码识别系统设计与实现
  • 使用Django从零开始构建一个个人博客系统 - 实践
  • 2025年磨床厂家TOP企业品牌推荐排行榜,平面磨床,外圆磨床,数控平面磨床,数控外圆磨床,7163平面磨床推荐这十家公司!
  • [LangChain] 02. 模型接口
  • 软件工程作业-报告1 - 实践
  • 2025 年 10 月国内加工中心制造商最新推荐排行榜:涵盖立式、卧式、龙门及多规格型号!
  • kali构建PHP_MYSQL
  • 题解:P6755 [BalticOI 2013] Pipes (Day1)
  • 语音合成技术从1秒样本学习表达风格
  • 我的高敏感和家人
  • 对称多项式
  • usb储存之BOT/UAS内核驱动
  • 软件研发 --- 汇编 之 初体验
  • 风控评分卡
  • 20232409 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 图 生成树
  • 资料拿取表
  • 2025年太阳能板终极指南:选择、趋势与品牌推荐