图是由节点(vertex)和边(edge)组成的一种数据结构,通常用来表示具有一定联系的对象之间的关系。图可以用来解决许多实际问题,例如路线规划、社交网络分析、电路设计等。
图的应用非常广泛,以下是一些常见的应用场景:
1. 社交网络分析:图可以用来表示人与人之间的关系,例如好友关系、职业关系等,以及对这些关系进行分析和预测。
2. 路线规划:图可以用来表示城市中的道路和交通方式,以及对最短路径和最优路径进行计算。
3. 电路设计:图可以用来表示电路中的器件和线路,以及对电路进行分析和优化。
4. 统计学习:图可以用来表示数据之间的关系,例如分类、聚类等。
5. 自然语言处理:图可以用来表示单词之间的关系,例如词义相似度、语法结构等。
以下是一个简单的图的实现,包括节点和边的定义以及图的遍历算法。```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 节点定义
struct Vertex {
int val;
vector<int> edges;
bool visited;
Vertex(int v): val(v), visited(false) {}
};
// 边定义
struct Edge {
int from, to;
Edge(int f, int t): from(f), to(t) {}
};
// 图定义
class Graph {
public:
Graph(int n): nodes(n) {}
void addEdge(int from, int to) {
nodes[from].edges.push_back(to);
edges.push_back(Edge(from, to));
}
void dfs(int start) {
dfsHelper(start);
for (int i = 0; i < nodes.size(); i++) {
if (!nodes[i].visited) {
dfsHelper(i);
}
}
}
void bfs(int start) {
queue<int> q;
q.push(start);
nodes[start].visited = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
cout << cur << " ";
for (int i = 0; i < nodes[cur].edges.size(); i++) {
int next = nodes[cur].edges[i];
if (!nodes[next].visited) {
nodes[next].visited = true;
q.push(next);
}
}
}
}
private:
void dfsHelper(int cur) {
nodes[cur].visited = true;
cout << cur << " ";
for (int i = 0; i < nodes[cur].edges.size(); i++) {
int next = nodes[cur].edges[i];
if (!nodes[next].visited) {
dfsHelper(next);
}
}
}
vector<Vertex> nodes;
vector<Edge> edges;
};
int main() {
// 创建一个有向图
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(3, 4);
// 深度优先遍历
cout << "DFS: ";
g.dfs(0);
cout << endl;
// 广度优先遍历
cout << "BFS: ";
g.bfs(0);
cout << endl;
return 0;
}
输出:
```
DFS: 0 1 3 4 2
BFS: 0 1 2 3 4
```
这个例子中,我们创建了一个有向图,包含5个节点和5条边。然后我们对这个图进行了深度优先遍历和广度优先遍历,并输出了遍历结果。