图算法
1、深度优先遍历
void DFS(vector<int> a)
{
int n = a.size();
vector<int> visit(n);
for (int i = 0; i < n; ++i) {
if (visit[i] == 0) { //判断是否访问过
DFSVisit(i);
}
}
}
void DFSVisit(int u, vector<int>& visit)
{
visit[u] = 1; //更新访问记录
for (int i = 0; i < n; ++i) { //遍历u的所有邻边
if (edge[u][i] == 1) {
if (visit[i] == 0) { //判断是否访问过
DFSVisit(i);
}
}
}
}
2、拓扑排序
拓扑排序是指:对于有依赖关系的图,即有向图,满足若从顶点Vi到顶点Vj有一条路径,则在排序中Vi必在Vj之前。
拓扑排序可以证明一个图中是否有环,如果排序完得到所有顶点,说明不存在环;如果输出顶点少了则存在环。
算法思想:用一个数据结构记录每个顶点的入度,先将所有入度为0的顶点入栈;之后如果栈不为空,则弹出栈顶元素,遍历该顶点为头所有邻接边,将其对应边中的尾顶点的入度依次减一,若之后其入度为0,加入栈中。
void TopologicalSort(Grphic g)
{
EdgeNode *e;
vector<int> indegree(n);
stack<int> recordStack;
for (int i = 0; i < n; ++i) {
if (indegree[i] == 0) {
recordStack.push(i);
}
}
while (!recordStack.empty()) {
int t = recordStack.top();
recordStack.pop();
for (int i = 0; i < n; ++i) {
if (g[t][i] == 1) {
if (!--indegree[i]) {
recordStack.push(i);
}
}
}
}
}