Graph-Overview
图的基本术语
- 阶(Order):图G中点集V的大小称作图G的阶
- 子图(Sub-Graph):当图
,其中 ,则 称作图 的子图
- 子图(Sub-Graph):当图
- 生成子图(Spanning Sub-Graph):指满足条件V(G′) = V(G)的G的子图
- 度(Degree):一个顶点的度是指与该顶点相关联的边的条数,顶点v的度记作d(v)。
- 入度(In-degree)和出度(Out-degree):一个顶点的入度是指与其关联的各边之中,以其为终点的边数;出度则是相对的概念,指以该顶点为起点的边数。
- 自环(Loop):若一条边的两个顶点为同一顶点,则此边称作自环。
- 路径(Path):从a到b的一条路径是指一个序列a(v_0),e_1,v_1,e_2,v_2,…,e_(k-1),b(v_k) ,其中e_i的顶点为v_i及v_(i-1),k称作路径的长度。如果它的起止顶点相同,该路径是“闭”的,反之,则称为“开”的。
- 行迹(Trace):如果路径P(a,b)中的边各不相同,则该路径称为a到b的一条行迹。闭的行迹称作回路(Circuit)。
- 轨道(Track):如果路径P(u,v)中的顶点各不相同,则该路径称为a到b的一条轨道。闭的轨道称作圈(Cycle)。
- 桥(Bridge):若去掉一条边,便会使得整个图不连通,该边称为桥。
行迹一定是轨道,轨道不一定是行迹
Graph Algorithm
- 最短路
- 最小生成树
- 二分图
- 拓扑排序
- 基环树
- 欧拉路径
拓扑排序
cpp
vector<int> topo_sort(int k, vector<vector<int>> &edges) {
vector<vector<int>> g(k);
vector<int> in_deg(k);
for (auto &e : edges) {
int x = e[0], y = e[1] ; // 顶点编号从 0 开始,方便计算
g[x].push_back(y);
++in_deg[y];
}
vector<int> order;
queue<int> q;
for (int i = 0; i < k; ++i)
if (in_deg[i] == 0)
q.push(i);
while (!q.empty()) {
int x = q.front();
q.pop();
order.push_back(x);
for (int y : g[x])
if (--in_deg[y] == 0)
q.push(y);
}
return order;
}