图中的最短环
1. 图中的最短环
广度优先搜索
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 ans = INT_MAX;
for (int i = 0; i < n; ++i) // 枚举每个起点跑 BFS,防止不连通
ans = min(ans, bfs(i,g));
return ans < INT_MAX ? ans : -1;
}
int bfs(int start, vector<vector<int>>& g){
int ans = INT_MAX;
vector<int> dis(g.size(),-1);//初始化到各点的顶点的最短距离,同时用于记录访问情况
dis[start] = 0;
queue<pair<int, int>> q;//队列用于广度优先,多一个数据用于指定方向
q.emplace(start, -1);//初始节点入队
while (!q.empty()) {
auto [x, fa] = q.front();
q.pop();
for (int y: g[x])//遍历相邻节点
if (dis[y] < 0) { // 第一次遇到
dis[y] = dis[x] + 1;
q.emplace(y, x);//该节点入队
} else if (y != fa) // 剔除来时的方向的节点
ans = min(ans, dis[x] + dis[y] + 1);//两路之和
}
return ans;
};
};