图论算法入门全解析,面试必考的图论题!
图论是算法面试中的重要考点。本文系统讲解图的存储、遍历和经典算法,附带完整C++代码实现,助你拿下图论面试题!
1. 图的基础概念
1.1 图的定义
图由**顶点(Vertex)和边(Edge)**组成:
- 无向图:边没有方向
- 有向图:边有方向
- 加权图:边有权重
- 无权图:边没有权重
1.2 图的存储方式
邻接矩阵
// 适合稠密图
const int MAXN = 1000;
int adj[MAXN][MAXN]; // adj[i][j] = 1 表示 i 和 j 之间有边
// 初始化
memset(adj, 0, sizeof(adj));
// 添加边(无向图)
void addEdge(int u, int v) {
adj[u][v] = 1;
adj[v][u] = 1;
}
邻接表
// 适合稀疏图
vector<int> adj[MAXN]; // adj[i] 存储顶点 i 的所有邻居
// 添加边(无向图)
void addEdge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u);
}
// 带权重的邻接表
struct Edge {
int to, weight;
};
vector<Edge> adj[MAXN];
void addEdge(int u, int v, int w) {
adj[u].push_back({
v, w});
adj[v].push_back({
u, w});
}
2. 图的遍历
2.1 深度优先搜索(DFS)
bool visited[MAXN];
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (int v : adj[u]) {
if (!visited[v]) {
dfs(v);
}
}
}
// 调用
memset(visited, false, sizeof(visited));
dfs(0); // 从顶点 0 开始遍历
2.2 广度优先搜索(BFS)
void bfs(int start) {
queue<int> q;
vector<bool> visited(MAXN, false);
q.push(start);
visited[start] = true;
while (!q.empty())


52

被折叠的 条评论
为什么被折叠?



