二分图、拓扑与欧拉

news/2025/10/15 21:00:44/文章来源:https://www.cnblogs.com/whx-diary/p/19144257

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.mzph.cn/news/937796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch作业

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt =====================…

pytorch实验题作业

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms import matplotlib.pyplot as plt 数据预处理:标准化+数…

每日笔记

忘了写了,但是没有关系,今天加油,今天学习了还健身了

Zhengrui #3346. DINO

被我暴力干过去了qwq。 你考虑一个事情,打开大样例,点击 .out 文件,发现几乎全是 \(0\),你想一想为什么,本质上是你的 \(mex\) 每增加 \(1\),你的点的数量就会至少翻一倍,也就是说,答案最多是 \(O(\log n)\) 级…

Pytorch深度学习训练

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms import matplotlib.pyplot as plt 数据预处理:标准化+数…

P11894 「LAOI-9」Update

题意十分甚至有九分的简单,但是这个东西似乎是不好做的,我想不出来任何已知的 log 数据结构维护它。 突然发现这个东西增长是缓慢的,我于是乎写了个程序验证,最后发现答案最多是 1e6 左右的一个数。 果然有的时候观…

win10软实时设置 - 教程

win10软实时设置 - 教程2025-10-15 20:47 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

实用指南:Hunyuan3D-Omni:可控3D资产生成的统一框架

实用指南:Hunyuan3D-Omni:可控3D资产生成的统一框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

ZR 2025 NOIP 二十连测 Day 3

40 + 100 + 30 + 20 = 190, Rank 61/130.打满了。25noip二十连测day3 链接:link 题解:题目内 时间:4.5h (2025.10.15 13:40~18:10) 题目数:4 难度:A B C D\(\color{#FFC116} 黄\)*1500估分:40 + 100 + 15 + [5,?…

实用指南:2025年9月个人工作生活总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P14223 [ICPC 2024 Kunming I] 乐观向上

题目传送门 欢迎光顾我的博客 我们考虑如何从左往右的进行填数操作。当我们填到位置 \(i\) 时, \(p_{i}\) 这个数能被填进去需要满足的条件就是 \(p_{0} \oplus p_{1} \oplus \cdots \oplus p_{i-1} \neq p_{i}\) 。 …

别再用均值填充了!MICE算法教你正确处理缺失数据

缺失数据处理一直是机器学习实践中的难点。MICE(Multivariate Imputation by Chained Equations)作为一种基于迭代思想的插补框架,可以处理复杂缺失值问题。因为它不是简单地用均值或中位数填补空缺,而是通过构建后…

P66实训题

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision.transforms import Compose, ToTensor, Nor…

非主流网站程序IndexNow添加方法

第一步:生成API密钥 打开:https://www.bing.com/indexnow/getstarted#implementation 得到一个txt文件,例如:1ad7ba0***4b64b045fbb****0ac5bfd.txt 将这个文件上传到网站根目录,上传之后不要删除。 第二部:新增…

卷积神经网络视频读书报告

《卷积神经网络(CNN)学习感悟》读书报告 24信计2 刘雨坤 摘要 本报告围绕卷积神经网络(CNN)展开深入学习与探讨。通过研读相关资料及观看教学视频,系统梳理了 CNN 的基本概念、核心运算原理、关键组成部分、技术优…

C 语言 - 内存操作函数以及字符串操作函数解析

预先了解 "\0" 标志它是 一个转义字符(escape character),表示的是 数值为 0 的字符,\0 就是 一个字节值为 0 的字符。 char str[] = "ABC"; //在 C语言的字符串 中,\0 用来表示 字符串的结束…

以*this返回局部对象的两种情况

1、以值返回局部对象class Person { public:Person(int age) {this->age = age;}// 以值方式返回局部对象会调用拷贝构造生成一个新的对象返回Person PersonAddPerson(Person p) {this->age += p.age;return *th…

2025.10.15

今天早八上离散数学课,然后上马克思主义原理,老师讲的很好,中午吃了一份沙县小吃的鸡腿饭,然后睡了两个小时觉,起床洗澡,然后上音乐鉴赏课,上课的时候制作了学生会部长成员表。

Kali 自定义ISO镜像

简单自定义 Kali live ISO 简单自定义一下kali 镜像的开机菜单和背景图,没太多技术含量,记录一下留存 # 下载构建脚本,建议在kali系统上构建 git clone https://gitlab.com/kalilinux/build-scripts/live-build-con…

2025秋_12

今天学习了Java