发现环
深度优先搜索算法,注意删除前导路径,就可以AC了
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <string.h> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100010 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; vector<int> g[LEN]; vector<int> path; vector<int> ans; int vis[LEN]; void dfs(int p,int s){ if(ans.size()>0) return; if(vis[s]){ ans=path; //删除前导路径 vector<int>::iterator it=ans.begin(); while(it!=ans.end()){ if(*it==s) break; else{ it=ans.erase(it); } } return; } path.push_back(s); vis[s]=1; int n=g[s].size(); for(int i=0;i<n;i++) if(g[s][i]!=p){ dfs(s,g[s][i]); } path.pop_back(); vis[s]=0; } int main(){ // freopen("D:/CbWorkspace/blue_bridge/发现环.txt","r",stdin); int N,i,a,b,j; I("%d",&N); for(i=1;i<=N;i++){ I("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } for(i=1;i<=N;i++){ dfs(-1,i); if(ans.size()>0){ sort(ans.begin(),ans.end()); int sz=ans.size(); for(j=0;j<sz;j++){ printf("%d",ans[j]); if(j!=sz-1) printf(" "); } return 0; } } return 0; }