1. 最短环问题概述
在无向图中寻找最短环是图论中的一个经典问题。所谓最短环,指的是图中长度最小的环路。这个问题在实际中有诸多应用场景,比如网络拓扑分析、社交网络中的关系挖掘等。
对于等边权图(即所有边的权重相同),我们可以利用广度优先搜索(BFS)的特性来高效解决这个问题。BFS之所以适合这类问题,是因为它天然具有"层级扩展"的特性,能够保证首次访问某个节点时记录的路径就是最短路径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BFS算法原理与实现
2.1 BFS基础概念
广度优先搜索是一种图遍历算法,它从起始节点开始,逐层向外扩展探索。在等边权图中,BFS有一个重要性质:当它首次访问某个节点时,所经过的路径就是从起点到该节点的最短路径。
这个性质对我们寻找最短环非常有用。因为环可以看作是从某个节点出发,经过若干节点后又回到自身的路径。通过BFS,我们可以有效地发现这样的结构。
2.2 算法实现细节
下面是使用BFS寻找最短环的核心代码实现:
cpp复制class Solution {
public:
int findShortestCycle(int n, vector<vector<int>> &edges) {
vector<vector<int>> g(n);
for (auto &e: edges) {
int x = e[0], y = e[1];
g[x].push_back(y);
g[y].push_back(x); // 构建邻接表
}
int dis[n]; // 记录从起点到各节点的距离
auto bfs = [&](int start) -> int {
int ans = INT_MAX;
memset(dis, -1, sizeof(dis)); // 初始化距离数组
dis[start] = 0; // 起点距离为0
queue<pair<int, int>> q;
q.emplace(start, -1); // 存储当前节
