题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560
思路:dfs判环,这里成环的条件是环中的每个点的出度和入度都为1,因此dfs的时候只须判断的相连的每个点的size()==2即可。
ps:为防暴栈手动开栈:#pragma comment(linker,"/STACk:10240000,10240000")

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 100100 8 #pragma comment(linker,"/STACk:10240000,10240000") 9 vector<int>map[MAXN]; 10 bool mark[MAXN]; 11 int n,m,cnt1,cnt2; 12 bool flag; 13 14 void dfs(int u){ 15 mark[u]=true; 16 if(map[u].size()!=2)flag=false; 17 for(int i=0;i<map[u].size();i++){ 18 int v=map[u][i]; 19 if(!mark[v])dfs(v); 20 } 21 } 22 23 int main(){ 24 int u,v; 25 while(~scanf("%d%d",&n,&m)&&(m+n)){ 26 cnt1=cnt2=0; 27 for(int i=0;i<n;i++)map[i].clear(); 28 for(int i=1;i<=m;i++){ 29 scanf("%d%d",&u,&v); 30 map[u].push_back(v); 31 map[v].push_back(u); 32 } 33 memset(mark,false,sizeof(mark)); 34 for(int i=0;i<n;i++){ 35 flag=true; 36 if(!mark[i]){ dfs(i);cnt1++;if(flag)cnt2++; } 37 } 38 printf("%d %d\n",cnt1,cnt2); 39 } 40 return 0; 41 }