ZOJ 3321

来源:互联网 发布:庄聚贤 知乎 编辑:程序博客网 时间:2024/05/16 02:53

图的“草根”解法大笑

#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);
}

原创粉丝点击