【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;
}

浙公网安备 33010602011771号