Codeforces Round #346 (Div. 2)E. New Reform 乱搞dfs

本文介绍了一种使用深度优先搜索(DFS)算法来划分图并计算无环区间的数量的方法。具体而言,通过DFS遍历图中的节点,并检查是否存在环路。如果找到的路径中存在重复边或多于一条路径连接相同的两点,则认为存在环路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dfs分成个个区间,每个区间不存在环结果加1.
判断环,1 a,b两点间有两条以上的路。
2.a,b有一条路径,且b此时已走过且b不是搜索这条路时走到a的前一个点

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm> 
using namespace std;
map<int,int>mp[110000];
int next[200000],link[200000],n,m,co[200000],l,last[200000];
bool sym[200000],sym2;
void init()
{
    l = 0;
    memset(next,-1,sizeof(next));
    memset(co,0,sizeof(co));
    memset(sym,0,sizeof(sym));
}
void add(int a,int b)
{
    link[l] = b;
    last[l] = next[a];
    next[a] = l;
    l++;
}
void dfs(int Last,int pre)
{
    co[pre] = 1;
    for(int i=next[pre];i!=-1;i = last[i])
    {
        if(!co[link[i]])dfs(pre,link[i]);
        else if(sym[link[i]]==true)sym2 = true;
        else if(link[i]!=Last)sym2 = true;
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int sum = 0;
        init();
        int a,b;
        for(int i=0;i<m;i++)
          {
              scanf("%d%d",&a,&b);
              add(a,b);
              add(b,a);
              mp[a][b]++;
              mp[b][a]++;
              if(mp[a][b]>=2)
              {
                sym[a] = true;
                sym[b] = true;
              }
          }
        for(int i=1;i<=n;i++)
          if(!co[i])
          {
            sym2 = false;
            dfs(i,i);
            if(!sym2)sum++;
          }
        printf("%d\n",sum);
        for(int i=1;i<=n;i++)
        mp[i].clear();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值