图的“草根”解法
#include<stdio.h>
#include<string.h>
int bsearch(int *A,int *B,int x1,int y1,int v)
{
int x=x1,y=y1,m;
while(x<y)
{
m=x+(y-x)/2;
if(A[m]==v)
return(m);
else
if(A[m]>v)
y=m;
else
x=m+1;
}
x=x1;y=y1;
while(x<y)
{
m=x+(y-x)/2;
if(B[m]==v)
return(m);
else
if(B[m]>v)
y=m;
else
x=m+1;
}
}
int main()
{
int i,j,t,t1,t2,m,n;
int a[15],b[20],c[20];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a)); //将数组a初始化,用于记录每个结点edges的数目//
for(i=1,j=1;i<=m;i++,j++)
{
scanf("%d%d",&t1,&t2);
a[t1]++; //记录输入结点edges的数目//
a[t2]++;
b[j]=t1;
c[j]=t2;
}
for(i=1;i<=n;i++)
if(a[i]!=2)
break;
if(n<3||n!=m||i<n) //如果所有结点刚好连成一个圆环,则从1到n每个结点
{ 都应该有且仅有两个edges即a[i]==2(i=1,...,n)//
printf("NO\n");
continue;
}
a[1]=b[1]; //a[i]用于存储以b[1]为初始结点的圆环上的各个结点,方法是在
a[2]=c[1]; 数组b和c中查找a[i]的相邻结点a[i+1],通过调用bsearch函数
b[1]=0; 返回值为a[i]在b(或c)数组中的位置k,则a[i+1]即为c[k](或
c[1]=0; b[k]),赋值a[++i]=c[k](或b[k]),之后将b[k],c[k]赋0,若能
i=2; 构成一个圆环,则最终b和c数组中所有元素均为0//
do
{
t=bsearch(b,c,1,m+1,a[i]);
if(b[t]==a[i])
{
a[++i]=c[t];
b[t]=0;
c[t]=0;
}
else
{
a[++i]=b[t];
b[t]=0;
c[t]=0;
}
}while(a[i]!=a[1]);
for(i=1;i<=m;i++)
if(b[i]!=0||c[i]!=0)
break;
if(i<=m)
printf("NO\n");
if(i>m)
printf("YES\n");
}
return(0);
}