Bootstrap

判断图中环的个数+记录所有环(dfs)

链式前向星+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;
}

;