This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub mugen1337/procon
#include "Graph2/CycleDetection.hpp"
#include "./GraphTemplate.hpp" template<typename T> vector<int> CycleDetection(Graph<T> &g){ int n=(int)g.size(); vector<int> check(n,0),cyc,pre(n,-1); function<bool(int)> dfs=[&](int cur){ check[cur]=1; for(auto &to:g[cur]){ if(check[to]==0){ pre[to]=cur; if(dfs(to)) return true; }else if(check[to]==1){// detect int v=cur; while(v!=to){ cyc.push_back(v); v=pre[v]; } cyc.push_back(v); return true; } } check[cur]=2; return false; }; for(int i=0;i<n;i++){ if(check[i]==0){ if(dfs(i)){ reverse(begin(cyc),end(cyc)); return cyc; } } } return {}; }
#line 1 "Graph2/GraphTemplate.hpp" // graph template // ref : https://ei1333.github.io/library/graph/graph-template.hpp template<typename T=int> struct Edge{ int from,to; T w; int idx; Edge()=default; Edge(int from,int to,T w=1,int idx=-1):from(from),to(to),w(w),idx(idx){} operator int() const{return to;} }; template<typename T=int> struct Graph{ vector<vector<Edge<T>>> g; int V,E; Graph()=default; Graph(int n):g(n),V(n),E(0){} int size(){ return (int)g.size(); } void resize(int k){ g.resize(k); V=k; } inline const vector<Edge<T>> &operator[](int k)const{ return (g.at(k)); } inline vector<Edge<T>> &operator[](int k){ return (g.at(k)); } void add_directed_edge(int from,int to,T cost=1){ g[from].emplace_back(from,to,cost,E++); } void add_edge(int from,int to,T cost=1){ g[from].emplace_back(from,to,cost,E); g[to].emplace_back(to,from,cost,E++); } void read(int m,int pad=-1,bool weighted=false,bool directed=false){ for(int i=0;i<m;i++){ int u,v;cin>>u>>v; u+=pad,v+=pad; T w=T(1); if(weighted) cin>>w; if(directed) add_directed_edge(u,v,w); else add_edge(u,v,w); } } }; #line 2 "Graph2/CycleDetection.hpp" template<typename T> vector<int> CycleDetection(Graph<T> &g){ int n=(int)g.size(); vector<int> check(n,0),cyc,pre(n,-1); function<bool(int)> dfs=[&](int cur){ check[cur]=1; for(auto &to:g[cur]){ if(check[to]==0){ pre[to]=cur; if(dfs(to)) return true; }else if(check[to]==1){// detect int v=cur; while(v!=to){ cyc.push_back(v); v=pre[v]; } cyc.push_back(v); return true; } } check[cur]=2; return false; }; for(int i=0;i<n;i++){ if(check[i]==0){ if(dfs(i)){ reverse(begin(cyc),end(cyc)); return cyc; } } } return {}; }