赞
踩
有向图是图论中的一种重要概念,它由一组顶点和一组有向边组成。每条有向边连接两个顶点,且有一个方向,表示从一个顶点指向另一个顶点。
有向图可以用来表示有方向关系的数据,比如网页之间的超链接关系、交通流向、任务依赖关系等。有向图中的顶点通常表示实体或节点,有向边表示节点之间的方向性关系。
有向图中的边可以有权重,表示两个顶点之间的关联强度或代价。有向图也可以存在环,即从一个顶点出发沿着有向边可以回到自身的情况。
有向图的一些重要概念包括入度(in-degree)和出度(out-degree),分别表示指向顶点的边的数量和从顶点出发的边的数量。有向图也可以进行拓扑排序,用于表示顶点之间的依赖关系。
总之,有向图是图论中的一种重要图形模型,它在许多领域都有着广泛的应用。
步骤如下:
拓扑排序的算法步骤,主要是通过不断更新顶点的入度来实现。这个算法的时间复杂度为O(V+E),其中V为顶点数,E为边数。
#include <iostream> #include <vector> #include <queue> #include <map> using namespace std; vector<int> topologicalSort(map<int, vector<int>>& graph, map<int, int>& inDegree) { int n = graph.size(); vector<int> result; queue<int> q; for (int i = 0; i < n; i++) { if (inDegree[i] == 0) { q.push(i); } } while (!q.empty()) { int node = q.front(); q.pop(); result.push_back(node); for (auto neighbor : graph[node]) { --inDegree[neighbor]; if (inDegree[neighbor] == 0) { q.push(neighbor); } } } return result; } bool hasCycle(vector<vector<int>>& graph) { map<int, int> inDegree; map<int, vector<int>> m; for (size_t i = 0; i < graph.size(); ++i) { if (graph[i].size() > 1) { ++inDegree[graph[i][1]]; m[graph[i][0]].push_back(graph[i][1]); } } vector<int> result = topologicalSort(m, inDegree); return result.size() != m.size(); } int main() { vector<vector<int>> graph = { { 0, 1 },{ 1, 2 }}; if (hasCycle(graph)) { cout << "有环" << endl; } else { cout << "无环" << endl; } graph = { { 0, 1 },{ 1, 2 },{ 3, 1 } }; if (hasCycle(graph)) { cout << "有环" << endl; } else { cout << "无环" << endl; } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。