P1636 Einstein学画画

一笔画问题

P1636 Einstein学画画

        如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。

 

 奇点:跟这个点相邻的边数目有奇数个的点

            不存在奇数个奇点的图

 

 PS: 对于有一笔画的图,存在以下两个定理:

定理一:存在欧拉路的条件:图是连通的,有且只有2个奇点

定理二:存在欧拉回路的条件:图是连通的,有0个奇点

 

so,如果寻找欧拉回路,对任意一个点进行深度优先遍历

       如果寻找欧拉路,则对一个奇点进行深度优先遍历

时间复杂度O(m+n),m为边数,n为点数

 

 

 

 

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,x,y,maq=0,ans=0;
int a[100000];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        a[x]++;a[y]++;
        if(x>maq)
        maq=x;
        if(y>maq)
        maq=y;
    }
    
    for(int i=1;i<=maq;i++)
    if(a[i]%2!=0)
       ans++;           //计算有多少个奇点
    if(ans==2||ans==0)  //符合欧拉路或欧拉回路,一笔画
    {
        cout<<1;
        return 0;
    }
    cout<<ans/2;         //两个奇点确定一笔画,多少组奇点确定多少组笔画
    return 0;
}

 

posted @ 2019-04-17 21:18  晔子  阅读(212)  评论(0编辑  收藏  举报