有向图的传递闭包实现三种实现(Warshall+DFS+BFS)
一、传递闭包:
定义:
有n
个顶点的有向图的传递闭包可以定义为一个n
阶布尔矩阵T[n][n]
,如果i
能到j
则T[i][j] =1
,否则T[i][j] =0
意义:
对于无向图,我们可以通过并查集来实现两个顶点是否有通路的快速查询。但有向图不能有并查集,所以现在可以用传递闭包了(当然无向图也可以用)
通过Floyd-Warshall
算法https://blog.csdn.net/qq_40691051/article/details/103278207
得到的dist
数组其实就可以充当传递闭包了,而第一种实现跟上面这个算法差不多,叫Wharshall
算法(上面的他也独立发明了)
代码1:
reach[][]
就是那个布尔矩阵(传递闭包)
#include<iostream>
#include<vector>using namespace std;#define V 4void printSolution(bool reach[][V])
{for(int i = 0; i < V; i++){for(int j = 0; j < V; j++){cout<<reach[i][j];}cout<<endl;}cout<<endl;
} void transitiveClosure(bool graph[][V])
{bool reach[V][V];for(int i = 0; i < V; i++){for(int j = 0; j < V; j++){reach[i][j] = graph[i][j]; }}for(int k = 0; k < V; k++){for(int i = 0; i < V; i++){for(int j = 0; j < V; j++){reach[i][j] = reach[i][j] ||( reach[i][k] && reach[k][j]);}}}printSolution(reach);
}
int main()
{ /* (0)------->(3) | /|\ | | | | \|/ | (1)------->(2) */bool graph[V][V] = { {1, 1, 0, 1}, {0, 1, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1} }; // Print the solution transitiveClosure(graph); return 0;
}
实现2、3:
一开始先把reach[][]
初始化为false
,然候通过DFS
或BFS
去从遍历(只遍历能到的点),能到就标记为true
#include<iostream>
#include<list>
#include<vector>
#include<queue>
#include<memory.h>
using namespace std;class Graph
{int n; //顶点数 list<int>*adj; //邻接表 bool **reach; //二维数组记录,reach[i][j] == 1(ture) ===> i->j有路 void BFSUtil(int src);void DFSUtil(int src, int v);
public:Graph(int _n);~Graph(){ delete [] adj; delete [] reach;}void addEdge(int u, int v){ adj[u].push_back(v); }void transitiveClosure();
};
Graph::Graph(int _n)
{n = _n;adj = new list<int>[_n];reach = new bool*[_n];for(int i = 0; i < _n; i++){reach[i] = new bool[_n];memset(reach[i], false, _n*sizeof(bool)); //一开始初始化为false}
}
void Graph::BFSUtil(int src)
{queue<int>q;q.push(src);while(!q.empty()){int u = q.front();q.pop();reach[src][u] = true;list<int>::iterator it;for(it = adj[u].begin(); it != adj[u].end(); it++){int v = *it;if(reach[src][v] == false){q.push(v);} }}
}
void Graph::DFSUtil(int src, int v)
{reach[src][v] = true;list<int>::iterator it;for(it = adj[v].begin(); it != adj[v].end(); it++){if(reach[src][*it] == false){DFSUtil(src , *it);} }
}
void Graph::transitiveClosure()
{for(int i = 0; i < n; i++){//DFSUtil(i , i); //每个点都能从自己到自己 BFSUtil(i); }//打印for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << reach[i][j] << " "; cout << endl; }
}
int main()
{ Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); cout << "Transitive closure matrix is \n"; g.transitiveClosure(); return 0;
}
有向图的传递闭包实现三种实现(Warshall+DFS+BFS)相关推荐
- 有向图强连通分量的三种算法
一. Kosaraju算法 1. 算法思路 基本思路: 这个算法可以说是最容易理解,最通用的算法,其比较关键的部分是同时应用了原图G和反图GT.(步骤1)先用对原图G进行深搜形成森林 ...
- Warshall算法求有向图的传递闭包
1定义是这样给出的,传递闭包:对于任何关系 R,R 的传递闭包总是存在的.传递关系的任何家族的交集也是传递的.进一步的,至少存在一个包含 R 的传递关系,也就是平凡的: X × X.R 传递闭包给出自 ...
- 最短路小结(三种算法+各种常见变种)
额,博主只是做了几(约数)道题而已,写这篇小结纯粹想留作纪念(勿喷,但是可以交流)(那啥,转载的话注明一下来源..打字不容易..) 最短路呢,包括三种算法,但是各有各的变种,其中变化有很多. 简单记录 ...
- 未能找到路径的一部分_车辆路径规划三种MIP模型
车辆路径规划问题的三个MIP模型.从直观的模型推导出高效的模型. 我们用最最标准的Capacitated VRP为例: CVRP问题描述:给定一张完全有向图: , 其中 是客户的集合, 分别是起点和终 ...
- 浅谈Floyd的三种用法 By cellur925
Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...
- mysql几种安装方法_mysql的三种安装方式(详细)
安装MySQL的方式常见的有三种: rpm包形式 通用二进制形式 源码编译 1,rpm包形式 (1) 操作系统发行商提供的 (2) MySQL官方提供的(版本更新,修复了更多常见BUG)www.mys ...
- 三种Fibonacci数列第n项计算方法及其优劣分析
感谢国防科技大学刘万伟老师和中国传媒大学胡凤国两位老师提供的思路,文章作者不能超过8个字符,我的名字就写个姓吧,名字不写了^_^.另外,除了本文讨论的三种方法,之前的文章中还讨论了另外几种方法,详见相 ...
- mysql是网状_三种数据模型---层次模型、网状模型以及关系模型
本文转载自:http://www.cnblogs.com/yue-blog/p/6010527.html 一.层次数据模型 定义:层次数据模型是用树状结构来组织数据的数据模型. 其实层次数据模型就是的 ...
- SNA(社会网络分析)——三种中心度总结
一 简介 社会网络分析中,中心度表示点的中心度,中心势表示整个网络的中心度(趋势).中心度常用的有三种,点度中心度.中间中心度和接近中心度. 二 三种中心度 点度中心度表示与该点直接相连的点的个数,无 ...
最新文章
- 任正非签发最新电邮:过去我们是为了赚点小钱,现在是要战胜美国
- web3.js(二)根据私钥推出地址查询以太数量
- pycharm 运行.py文件如何像控制台那样传参?
- [Qt教程] 第39篇 网络(九)进程和线程
- web项目怎么打包上线_高级前端web工程师简历范文,【工作经历+项目经验+自我评价】怎么写...
- linux公社 java算法_Java快速排序算法
- 计算机系统占有率,微软继续领跑PC操作系统市场 Win10占有率突破25%
- 《20天吃透Pytorch》Pytorch自动微分机制学习
- Visual Studio 2019 16.6 Preview 2 发布
- LeetCode 119. Pascal’s Triangle II
- 哈夫曼树以及哈夫曼编码python
- PHP 5.4 内置 web 服务器
- 9、从命令行运行postman脚本及生成测试报告
- HiC软件安装篇之Lachesis
- win7误删文件怎么恢复?
- xp系统无法访问计算机,xp系统Workgroup无法访问怎么解决
- mysql like 百分号_mysql语句中使用like后面的%(百分号)的问题
- 论微信小程序安装SSL证书的重要性
- 网页字体单位px、em、%、rem、pt、vm、vh介绍
- 类模板中的友元,友元类
热门文章
- 5岁自学python编程-哈尔滨python少儿编程
- python编程是干嘛的-Python编程一般可以用来做什么
- python是什么意思怎么读-python怎么读,python是什么意思
- python学习-要学 Python 需要怎样的基础?
- python画简便的图-特征锦囊:常用的统计图在Python里怎么画?
- python使用缩进来体现-Python 使用缩进来体现代码之间的逻辑关系 .
- 运筹学常考知识点总结一
- vue中使用scss
- vue项目中使用lib-flexible解决移动端适配
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具