首页 > 其他 > 详细

nyoj- 一笔画问题

时间:2015-04-06 21:45:03      阅读:187      评论:0      收藏:0      [点我收藏+]

判断是不是一个欧拉图

1.是一个连通图

2.只有2个或者没有奇数结点

#include <iostream>
#include <cstring>
using namespace std;

const int Max = 1001;
int num[Max];
int f[Max];

int getf(int v)
{
    if(f[v]==v)
        return v;
    else
     {f[v]= getf(f[v]);    
     return f[v];}
}
int merg(int a, int b)
{
    int t1 = getf(a);
    int t2 = getf(b);
    if(t1 != t2)
     {
          f[t2] = t1;
          return 1;
      }
    return 0;
}
     
int main()
{
    int n;
    int vn,en;
     cin >> n;
     while(n--)
     {
              cin >> vn >> en;
              for(int i = 1; i <= vn;i++)
                f[i] = i;  
              memset(num,0,sizeof(num));
              int count = 0;
              int a,b; 
              int sign = 0;
              for(int i = 0; i < en; i++)
              {
                       cin >> a >> b;
                       merg(a,b);        //合并a,b结点 
                       num[a]++;
                       num[b]++;
              }
              for(int i =1; i < vn; i++)
                if(merg(i,i+1))     //不连通,退出循环
                 {
                        sign  = 1;
                        cout << "No" << endl;
                        break;
                     
                 }
                 if(sign)
                  continue;
              for(int i = 1; i <= vn; i++)
                if(num[i] % 2 == 1)
                  count ++;   
              if(count == 0 || count == 2)
                cout << "Yes" << endl;
              else
                cout << "No" << endl;
       }
               system("pause");
                return 0;
}

 

nyoj- 一笔画问题

原文:http://www.cnblogs.com/ekinzhang/p/4396529.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!