这里记录一种简单(码量小)的方法。
核心思想是借助dfs/递归来实现
借助vis数组保存三种状态:
- vis[u]=0 该节点尚未被访问
- vis[u]=1 该节点正在被访问(正在当前的递归中)
- vis[u]=2 该节点已经完成了访问
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 10;
vector<int> g[maxn];
int vis[maxn];
bool cyc=0;//是否有环
void dfs(int v){
vis[v]=1;//节点加入递归
for(auto p:g[v]){
if(vis[p]==1){//该节点在当前递归中,说明形成了环
cyc=1;
}else if(vis[p]==0){//没有被访问,则继续递归
dfs(p);
}
}
vis[v]=2;//节点结束递归
}
int main(){
//...
for(int i=1;i<=n;i++){
if(vis[i]==0) dfs(i);
}
//...
}
贴一道题:https://codeforces.com/contest/1217/problem/D