找圈圈 (BFS简单运用)

题目位置

题目大意是给一个无向连通图,找其中有几个标准的圈。

所谓标准的圈,就是一个圈外不能有其他线段和环。那么其中每个点都只有两条边

我的方法是用bfs将连通的一组点放入一个队列中,如果这些点都只有两条边,那么这些点形成一个圈;如果其中有一个点的边数!=2,那么这些点没有形成圈。

#include <iostream>
#include <stdio.h>
using namespace std;
int n,m,head[1000010],zz=0,vis[1000010],edge[1000010],que[1000010];
struct HAHA{
    int v,next;
}list[2000010];

void connect(int u,int v)
{
    zz++;
    list[zz].v=v;
    list[zz].next=head[u];
    head[u]=zz;
    edge[u]++;
}

int bfs(int start)
{
    int hz=1,tz=1;
    que[hz]=start;
    vis[start]=1;
    while(hz<=tz)
    {
        int now=que[hz];
        for(int i=head[now];i;i=list[i].next)
        {
            int v=list[i].v;
            if(vis[v]) continue;
            tz++;
            vis[v]=1;
            que[tz]=v;
        }
        hz++;
    }
    for(int i=1;i<=tz;i++)
    {
        if(edge[que[i]]!=2) return 0;
    }
    return 1;
}

int main()
{
    scanf("%d%d",&n,&m);
    int d1,d2;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&d1,&d2);
        connect(d1,d2);
        connect(d2,d1);
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]) ans+=bfs(i);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2019-03-10 21:48  BakaCirno  阅读(397)  评论(0编辑  收藏  举报