IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 图的模板 总结 -> 正文阅读

[数据结构与算法]图的模板 总结

1.求有向图的欧拉路---------------------------------------------------O(边数)

了解几个概念:
欧拉通路:通过图中所有边,但构不成回路->有向半欧拉图
无向半欧拉图的特点:当且仅当连通且
仅有两个奇度节点
有向半欧拉图的特点:当且仅当强连通且
恰有一个顶点的出度=入度+1;(起点)
恰有一个顶点的入度=出度+1;(重点)
所有其他顶点的入度和出度相同。
欧拉回路:通过图中所有边,且可以构成回路->有向欧拉图
无向欧拉图的特点:当且仅当连通且
无奇度节点
有向欧拉图的特点:当且仅当强连通且
每个顶点的入度和出度相同

求有向图欧拉路的流程:
1.从起点出发,进行深度优先搜索。
2.每次沿着某条边从某个顶点移动到另外一个顶点的时候,都需要删除这条边。
3.如果没有可移动的路径,则将所在节点加入到栈中,并返回。
注意:当遍历完一个节点所连的所有节点后,我们才将该节点入栈(即逆序入栈),我们只要将栈中的内容反转,即可得到答案。
详解
leetcode332:https://leetcode-cn.com/problems/reconstruct-itinerary/solution/zhong-xin-an-pai-xing-cheng-by-leetcode-solution/
模板如下:

题目:给定起点,找欧拉通路。要求:针对同一条边,终点优先选字典序较小的节点->优先队列实现
unordered_map<string, priority_queue<sting, greater<string>>> ump; //用优先队列来找字典序最小的节点
vector<string> ans;
void dfs(string str) {
	while (ump.size()) {
		string tmp = ump[str].top(); //得到字典序最小的边
		ump[str].pop(); //删边
		dfs(tmp); 
	}
	v.push_back(str);
}
for (auto& each : tickets) {
    ump[each[0]].push(each[1]);
}
dfs(起点);
reverse(ans.begin(), ans.end());
return ans;

重点
1.对于半欧拉图,找欧拉通路,从起点开始dfs

如果不知道起点,先找起点:对每条边,对起点度数--,终点度数++,最终起点的度数为-1.
unordered_map<string, int> ump;
for (auto& each : tickets) {
    ump[each[0]]--;
    ump[each[1]]++;
}
for (auto& each : ump) {
	if (each.second == -1) dfs(each.first);
}

2.对于欧拉图,找欧拉通路,从任意节点开始dfs
3.如果最后需要得到pair对

for (int i = 0; i < ans1.size() - 1; ++i) {
    ans2.push_back(vector<int>{ans1[i], ans1[i + 1]});
}

2.求有向无环图的拓扑排序 ---------------------------------------------------O(顶点数+边数)
思路
用indegree[]数组存每个结点的入度,将入度为0的节点放入队列,每出队一个结点u,就将它所能到的所有节点v的入度-1(用vector v[indegree.size()]来存),如果v的入度为0,则入队。
如果要求按照节点递增的顺序拓扑排序,则将队列改为:优先队列
step1:先得到邻接表+入度数组
step2:队列写个循环

//可以用来判断是否是有向无环图  v为vector<vector<int>>,存储所有的边
unordered_map<string, int> indegree; //节点->入度数
for (auto& each : v) { //v存起点->终点的vector<vector<string>>
	indegree[each[1]]++;
}
vector<string> v[indegree.size()]; //邻接表存储
for (auto& each : v) {
	v[each[0]].push_back(each[1]);
}
queue<string> q;
//priority_queue<string, vector<string>, greater<string>> q;
for (auto& each : indegree) {
	if (!each.second) q.push(each.first);
}
int cnt = 0;
while (!q.empty()) {
	string frt = q.front();
	//cout << frt << endl;
	q.pop();
	cnt++;
	for (auto& each : v[frt]) {
		indegree[each]--;
		if (!indegree[each]) q.push(each);
	}
}
if (cnt == indegree.size()) return true; //是有向无环图
return false; //不是有向无环图
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:30:50  更:2021-12-06 15:32:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:38:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码