zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    第三次上机练习
    第三次作业
    第二次上级练习
    第二次作业
    第一次上机练习
    第一次作业
    4.20
    4.16
    4.10
    4.9
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10726252.html
Copyright © 2011-2022 走看看