有向图和无向图dfs判断是否成环

有向图dfs

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 10005;
vector<int> v[maxx];
int pos[maxx];
int flag = 0;
void dfs(int x)
{
    pos[x] = 1;
    for(int i=0;i<v[x].size();i++){
        if(pos[v[x][i]] == 1){
            flag = 1;
            return ;
        }
        if(pos[v[x][i]] == 0){
            dfs(v[x][i]);
        }
    }
    pos[x] = 2;
}
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    memset(pos,0,sizeof(pos));
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        v[x].push_back(y);
    }
    for(int i=1;i<=n;i++){
        if(pos[i] == 0){
            dfs(i);
        }
        if(flag){
            break ;
        }
    }
    if(flag){
        printf("有环\n");
    }else{
        printf("无环\n");
    }
    return 0;
}

无向图dfs

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 10005;
vector<int> v[maxx];
int pos[maxx];
int flag = 0;
void dfs(int x,int pre)
{
    pos[x] = 1;
    for(int i=0;i<v[x].size();i++){
        if(v[x][i] == pre){
            continue ;
        }
        if(pos[v[x][i]]){
            flag = 1;
            return ;
        }
        dfs(v[x][i] , x);
    }
}
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    memset(pos,0,sizeof(pos));
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1 , 0);
    if(flag){
        printf("有环\n");
    }else{
        printf("无环\n");
    }
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 17:02
点赞 评论 收藏
分享
点赞 评论 收藏
分享
11-03 18:50
门头沟学院 Java
迷茫的大四🐶:问就是马上到,一周五天,6个月以上,全国可飞
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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