图中的最短环

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;
        };
};
posted @ 2023-04-12 01:33  失控D大白兔  阅读(17)  评论(0编辑  收藏  举报