簡體   English   中英

在有向圖中找到循環

[英]Finding the cycle in a directed graph

我正在解決一個問題,以確定圖形是否包含循環。 我使用着色方法解決了它(在訪問的數組中我將標記,如果它從未訪問過,則為 0,如果已訪問過,如果已訪問過,則為 2)為此我編寫了代碼:

#include <bits/stdc++.h>
using namespace std;

vector<int> adj[20005];
int vis[20005];
int chk = 0;
void dfs(int u){
    if(vis[u]==1) {
        chk = 1;
        return;
    }
    if(vis[u]==2) return;
    vis[u] = 1;
    for(auto v:adj[u]) dfs(v);
    vis[u] = 2;
} 

int main(){
    int N, M; cin>>N>>M;
    for(int i = 0; i<M; i++){
        int p, q; cin>>p>>q;
        adj[p].push_back(q);
    }
    for(int i = 1; i<=N; i++){
        if(vis[i]==1) break;
        if(!vis[i]) dfs(i);
    }   
    cout<<(chk?"Yes\n":"No\n");
}

現在,我在想,是否有辦法編寫已檢測到的循環。 我知道大多數人會說 DFS 和回溯,它非常直觀。 但想知道我該如何實現它。

par[v] - v 的父節點,pr - 之前訪問過的節點:

void dfs(int u, int pr = -1){
    if(vis[u]==1) {
        vector<int> cycle();
        int cur = pr;
        while(cur != u) {
            cycle.push_back(cur);
            cur = par[cur]
        }
        cycle.push_back(u);
        chk = 1;
        return;
    }
    if(vis[u]==2) return;
    vis[u] = 1;
    par[u] = pr;
    for(auto v:adj[u]) dfs(v, u);
    vis[u] = 2;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM