题解 | #回路#

回路

http://www.nowcoder.com/practice/2a5153a6d2bd43949764c068b4f29d26

题目的主要信息:

  • n个节点,m条边,数组edge记录的是有边的两个节点
  • 判断这个图是否有从1号节点开始的回路

方法一:dfs

具体做法:

首先我们构建图。然后从节点1开始进行深度优先搜索,遍历与其相连的每一个节点,每到一个节点不能遍历前序节点或者已经访问过的,然后每次需要判断是否回到了节点1,如果没有则继续深度优先搜索往下走,如果最后也没有回到节点1,返回false。

class Solution {
public:
    bool dfs(int cur, int pre, vector<vector<int>>& G, vector<int>& vis){
        for(int i = 0; i < G[cur].size(); i++){ //遍历每个节点
            int next = G[cur][i];
            if(next == pre) //不能是前序节点
                continue;
            if(!vis[next]){
                vis[next] = true;
                if(next == 1 || dfs(next, cur, G, vis)) //回到了1或者子节点的dfs回到了1
                    return true;
            }
        }
        return false;
    }
    string solve(vector<int>& param, vector<Point>& edge) {
        int n = param[0];
        int m = param[1]; //先找到m和n
        vector<vector<int> > G(n + 1);
        vector<int> vis(n + 1, 0);  //记录是否访问过
        for(int i = 0; i < m; i++){ //构建图
            G[edge[i].x].push_back(edge[i].y);
            G[edge[i].y].push_back(edge[i].x);
        }
        if(dfs(1, -1, G, vis)) //深度优先搜索判断
            return "Yes";
        return "No";
    }
};

复杂度分析:

  • 时间复杂度:O(m+n)O(m+n),构建图遍历mm,深度优先搜索遍历nn个节点
  • 空间复杂度:O(n2)O(n^2),最坏情况下保存图的列表G为邻接矩阵

方法二:bfs

具体做法:

同理,有dfs就会有bfs。我们可以广度优先搜索与节点1相连的所有结点,并对其每个做一个单独的标记,然后继续广度优先搜索,子节点的的标记就等于父节点的标记(只有节点1相连的不一样),如果广度优先搜索到后面,遇到相邻两个不相同标记的节点,说明这里可以构成一圈即一个回路。 如下图所示: 图片说明

class Solution {
public:
    string solve(vector<int>& param, vector<Point>& edge) {
        int n = param[0];
        int m = param[1]; //先找到m和n
        vector<vector<int> > G(n + 1);
        vector<int> vis(n + 1, -1);  //记录是否访问过
        for(int i = 0; i < m; i++){ //构建图
            G[edge[i].x].push_back(edge[i].y);
            G[edge[i].y].push_back(edge[i].x);
        }
        queue<int> q; //bfs辅助队列
        q.push(1);
        vis[1] = 0; //从1号开始访问
        while(!q.empty()){ //bfs
            int cur = q.front();
            q.pop();
            for(int i = 0; i < G[cur].size(); i++){
                int next = G[cur][i];
                if(vis[next] == -1){ //未访问过
                    q.push(next); //进入队列后续访问
                    if(cur == 1)  //标记
                        vis[next] = i + 1;
                    else
                        vis[next] = vis[cur];
                }else{
                    if(vis[next] != vis[cur] && next != 1) //不同点相遇,有回路
                        return "Yes";
                }
            }
        }
        return "No";
    }
};

复杂度分析:

  • 时间复杂度:O(m+n)O(m+n),构建图遍历mm,深度优先搜索遍历nn个节点
  • 空间复杂度:O(n2)O(n^2),最坏情况下保存图的列表G为邻接矩阵
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务