【学习总结】图论经典-拓扑排序
来源:互联网 发布:90后童年游戏 知乎 编辑:程序博客网 时间:2024/05/17 06:21
拓扑排序
<1>有向图的表示方式可以分成邻接矩阵和邻接表两种。
邻接矩阵是指用一个n*n的数组,下标为i,j的位置记录点i和点j的关系。(适用与稀疏矩阵,对内存空间要求要比较高)
邻接表是单纯记录关系的数组,比如 i和 j 有关系, 就将 j 放在 [i][k]的位置(k为当前与i有关系的点数),这种表示法适用于关系较少的时候,但是引用进STL中的vector以后,好像数据量的大小对其就没有什么太大的影响了。
<2>拓扑排序:每次找到入度为0 的点,并将其出度清空(可以用DFS或BFS),跟据表示的方法不同,操作也会有所差别。
<3>给出有向图之后,会有存在拓扑排序和不存在拓扑排序之分,如果图中存在有向环,则不存在拓扑排序(就是在遍历的过程中直接和间接的相互指向),在处理上只要记录每个点的访问状态就可以了,是正在访问(不满足的情况),还是未访问,或是已经访问过(DFS)。
如果存在了拓扑排序,也会有拓扑排序唯不唯一的问题(如果没有要求考虑这点,用DFS会号做一些),这点其实也好处理,只要每次入度为0的点只有一个才可以(BFS)。
DFS + 邻接矩阵
// DFS + 邻接矩阵。int vis[MAXN];int topo[MAXN], cnt;bool DFS(int u){vis[u] = -1;//表示当前正在访问,如果再次访问说明不存在topo排序。for (int i = 0; i < n; i++){if (G[u][i]){if (vis[i] < 0)return false;//存在有向环,失败退出。else if (!vis[i] && !DFS(i))return false;}}vis[u] = 1;topo[--cnt] = u;return true;// 成功记录,返回true 。}bool toposort(){cnt = n;memset(vis, 0, sizeof(vis));// 如果要考虑排序是否唯一,这边每次都需将所有点遍历过一遍,且每次只可有一点的入度为0。for (int u = 0; u < n; u++)if (!DFS(u))return false;return true;}BFS(借助STL-queue) + 邻接表(借助STL-vector)
// BFS + 邻接表。vector<int> G[MAXN];// 邻接表。int son[MAXN];// 入度数。void topo(){queue<int> que;int ok = 0;for (int i = 0; i < n; i++)if (!son[i])que.push(i);// 入度为0时入队。while (!que.empty()){if (que.size() > 1)ok = 1;// 当队列中个数超多1时,表示有不唯一解。int t = que.front();que.pop();cnt--;//如果队列为空后,计数器> 0, 说明存在环结构。for (int i = 0; i < G[t].size(); i++)if (--son[G[t][i]] == 0) // 判断减掉当前点的关系后,点的入度是否为0。que.push(G[t][i]);}}
下面推荐一些习题,还有鄙人的一些解题报告,话说刚开始写的很渣,见谅:
比较简单
uva 10305 http://blog.csdn.net/keshuai19940722/article/details/9672157
hdu 1285 http://blog.csdn.net/keshuai19940722/article/details/9712961
hdu 3342 http://blog.csdn.net/keshuai19940722/article/details/9713437
这题必须用到邻接表
hdu 2647 http://blog.csdn.net/keshuai19940722/article/details/9715331
难度加深
uva196 http://blog.csdn.net/keshuai19940722/article/details/9707457
poj 1094 http://blog.csdn.net/keshuai19940722/article/details/9732923
难度较大(考查到并查集+STL)
hdu 1811 http://blog.csdn.net/keshuai19940722/article/details/9723855
(欢迎补充)
- 【学习总结】图论经典-拓扑排序
- 拓扑排序学习总结
- poj 1094 拓扑排序 经典
- uva10305 拓扑排序经典dfs
- Poj1094拓扑排序总结
- 拓扑排序总结
- 拓扑排序总结
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 图论之拓扑排序
- 数据结构学习_图(1)拓扑排序
- 数据结构学习笔记 --- 图(拓扑排序)
- 算法学习 - 图的拓扑排序
- web集群时session同步的3种方法
- c语言自定义函数大全
- iOS开源项目
- Hibernate入门DEMO
- 漫谈Microsoft SQL Server连接中常见问题
- 【学习总结】图论经典-拓扑排序
- ORACLE 日期增加8小时
- 常见的可用的爬虫项目
- 黑马程序员---在HTML文档中引用CSS有几种方式?请指出它们分别是什么?
- PHP程序报错:Warning: Cannot modify header information - headers already sent的问题解决方法
- Linux系统的启动过程
- XML---Android中解析XML .
- mysql智能存储过程
- 单例模式的实现