【cf977e Cyclic Components】

题意就是无向图找环,输出环的数量,每个环的节点只可能有两条边,那么只用从度数为二的节点开始,判断连接的节点是否在一条环上就行。

AC代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
using namespace std;

typedef long long ll;

const int MAXN = 200005;

vector<int> v[MAXN]; //记录边
int p[MAXN]={0}; //记录点是否检察过
int n,m;

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d %d",&a,&b);
		v[a].push_back(b);
		v[b].push_back(a);
	}
	int sum=0;
	for(int i=1;i<n;i++){
		if(!p[i]&&v[i].size()==2){
			int k=i;
			while(v[k].size()==2){
				if(v[k][0]<v[k][1]) swap(v[k][0],v[k][1]); //这里交换一下,优先检查连接的两个节点中大的那个,不然会因为录入边的顺序影响检查顺序。个人感觉统一的检查顺序比较好写
				p[k]=1;
				int t = k;
				if(!p[v[k][0]]) k=v[k][0];
				else k=v[k][1];
				v[t].clear(); //清空检查过的点,防止死循环
				if(k==i) break;
			}
			if(k==i) sum++;
		}
	}
	printf("%d\n",sum);
	return 0;
}
posted @ 2020-11-06 13:58  樱与梅子  阅读(59)  评论(0)    收藏  举报