链式前向星+dfs即可
因为是无向图,稍作修改就可以用有向图了
#include<bits/stdc++.h>//直接万能头了
using namespace std;
const int maxn = 1e6;
struct node{
int to,next;
}e[maxn]; //边集
int cnt; //计数
int nums = 0;
int head[maxn],vis[maxn],pre[maxn];
void addnode(int u,int v){ //加边(链式前向星)
e[++cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
void dfs(int x,int fa){ //dfs
vis[x] = 1;
for(int i = head[x];i;i=e[i].next){
int y = e[i].to;
if(y==fa) continue; //如果是无向的 a-->b 的同时也有 b-->a,所以直接排除另外的一种情况
if(vis[y]==0){ //如果没有访问就标记当前元素的前一个元素
pre[y] = x;
dfs(y,x); //并且一直递归访问下去
}else if(vis[y]==1){
int temp = x;
int count = 1;
while (temp!=y) //找路径
{
cout << temp << " ";
count++;
temp = pre[temp];
}
cout << y << endl;
//cout << endl;
nums++; //环数+1
}
}
vis[x] = 2;
}
int main()
{
int n,m;int u,v; //n为点数 m为边数 u是起点v是终点
cin >> n >> m;
for(int i = 1;i <= m;i++){
cin >> u >> v;
addnode(u,v);
addnode(v,u);
}
for(int i = 1;i <= n;i++){ //可能是非联通图
if(vis[i]==0) //每一次可以访问完和该点相连的所有点
dfs(i,-1);
}
cout << nums << endl; //环数
return 0;
}