E. Cyclic Components(环的判定)

环的定义

环的定义是在路径的定义的基础上做了一定的拓展,首尾相接的路径我们就把它叫做一个环。同样我们也有简单环,也就是除开首尾以外,剩下的部分不会经过重复的点的环就叫做简单环。

这个题就是判断图中简单环的数量,由此我们可以得知在无向图中的简单环,其实就是每个点的入度为2,因此我们可以利用这个方法来求环的数目。(当时居然没想到入度和出度QAQ)

注意此处不能用拓扑排序的原因是拓扑排序只能判断有无环,不能判断是不是只有环

#include <bits/stdc++.h>
#define int long long
#define x  first
#define y  second
#define rec(n) for(int i=1;i<=n;i++)
//#define double long double
using namespace std;
const int N=5e5+10,mol=1e18;
int h[N],e[N],ne[N],idx,st[N],w[N];
typedef pair<int,int>PII;
map<PII,int>ms;
//bool st[10][10];
void add(int a,int b)
{
    ne[idx]=h[a];e[idx]=b;
    h[a]=idx++;
    w[b]++;
    
}int f=1;
void  dfs(int a)
{
if(w[a]!=2)
{
    f=0;
    return ;
}
st[a]=1;

for(int i=h[a];i!=-1;i=ne[i])
{
    int j=e[i];
    if(!st[j])dfs(j);
}
return ;
}
void sove(){
    memset(h,-1,sizeof h);
  int n,m;
  cin>>n>>m;
  while(m--)
  {
      int a,b;
      cin>>a>>b;
      add(a,b);
      add(b,a);
  }
  int sum=0;
      for(int i=1;i<=n;i++)
      {
          if(!st[i])
          {f=1;
              dfs(i);
              if(f)sum++;
          }
      }
      cout<<sum;
}
signed main()
{
//    std::ios::sync_with_stdio(false);
//    std::cin.tie(0);
//    std::cout.tie(0);
    //rand();
    //srand((unsigned)time(NULL));
    int t=1;
    //cin>>t;
    while(t--)sove();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值