找圈圈 (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; }