有向图
在有向图中,边是单向的:每条边所连接的两个顶点是一个有序对,他们的邻接性是单向的。
术语
有向图:由一组由方向的边组成的,每条有方向的边都连接着有序的一对顶点。
有向路径:由一系列顶点组成,对于其中的每个顶点都存在一条有向边从他指向序列的下一个顶点。
有向环:为一条至少含有一条边且起点和终点相同的有向路径。
简单有向环:一条除了起点终点外不含重复的顶点和边的环。
路径或环的长度:即为其包含的边数。
有向图解决的问题
有向图的构建 | Digraph |
单点和多点的可达性 | DirectedDFS |
单点有向路径 | DepthFirstDirectedPaths |
单点最短路径 | BreadthFirstDiretedPaths |
有向环检测 | DirectedCycle |
深度优先的顶点排序 | DepthFirstOrder |
优先级限制下的调度问题 | Topological |
拓扑排序 | Topological |
强连通性 | KosarajuSCC |
顶点对的可达性 | TransitiveClosure |
实现:
1.有向图的构建
有向图的构建与无向图基本相似,只是把边的双向输入变成了单向输入即可。
代码:
#ifndef DIGRAPH_H
#define DIGRAPH_H
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
#include<vector>
using std::vector;
#include"Bag.h"
class Digraph
{
private:
int V = 0;//顶点数
int E = 0;//边数
vector<Bag<int>> adj;//邻接表
public:
Digraph(int V) :V(V), E(0), adj(V){}
Digraph(int V, int E) :V(V), E(0), adj(V)
{
int v, w;
for (int i = 0; i < E; i++)
{
cout << "输入第" << i << "条边的两个顶点:" << endl;
cin >> v >> w;
addEdge(v, w);
}
}
int getV(){ return V; }
int getE(){ return E; }
void addEdge(int v, int w)
{
adj[v].add(w);
E++;
}
Bag<int> getadj(int v){ return adj[v]; }
Digraph reverse()
{
Digraph R(V);
for (int v = 0; v < V; v++)
for (int w : getadj(v))
R.addEdge(w, v);
return R;
}
};
#endif
测试用例:
#include<iostream>
#include<vector>
#include<string>
#include"Digraph.h"
using namespace std;
int main()
{
cout << "输入图顶点数和边数:" << endl;
int v, e;
cin >> v >> e;
Digraph d(v, e);
cout << "输出邻接表:" << endl;
for (int i = 0; i < d.getV(); i++)
{
cout << i << ": ";
for (auto w : d.getadj(i))
cout << w << " &#