小埋学习图之环问题

#include <bits/stdc++.h>
using namespace std;
vector<int> mp[1005];
int n, m, ans = INT_MAX;
int bfs(int sx);
int main()
{
    // 输入构建邻接表
    cin >> n >> m;
    for (int i =1;i <= m;i++){
    	int x, y;
    	cin >>x >> y;
    	mp[x].push_back(y);
    	mp[y].push_back(x);
	}
    for (int i = 1; i <= n; i++) // 以内一个节点作为开头进行搜索,找最小环
    {
        int tm = bfs(i);
		if(tm != -1)ans = min(ans, tm);
    }
    if (ans < INT_MAX)cout <<ans;
    else cout << -1;
    return 0;
}
int bfs(int sx)
{
    queue<int> que;
    int vis[1001];
    memset(vis, -1, sizeof(vis)); // 标记
    que.push(sx);          // 起点
    vis[sx] = 0;
    while (que.size())
    {
        int hd = que.front();
        que.pop();
        for (int i = 0;i < mp[hd].size();i++) // 遍历队头的所有邻居
        {
            int nid = mp[hd][i];
            if (vis[nid] == -1)
            {
                vis[nid] = vis[hd] + 1; // 标记并入队搜索
                que.push(nid);
            }
            else if (vis[nid] < vis[hd]) // 走过
            {
                // 计算环的大小
                return vis[nid]; // int, return vis[];
            }
        }
    }
    return -1;
}

老师说是在计算环的大小的else if和return那里有错
但我不知道怎么写

看不懂

虽说建议用dfs
但我看了下好像
应该用nid==sx return vis[sx]

主要思路是从每个点的下一个位置开始搜
回到原点就是环
应该是输出原点vis吧

我也不太清楚
我用的dfs
:slightly_smiling_face:

。。。

胡桃路过ing…

别路过了

路过路过略略略

路过ing

路过+123456789

1 个赞