zoukankan      html  css  js  c++  java
  • HDU-1878 判断无向图欧拉回路,水

    HDU 1878

    题意:问一个无向图是否存在欧拉回路。

    总结

    1、一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
    2、一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
    3、要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
    假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路。

    // HDU-1878
    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define F(i,a,b)  for (int i=a;i<b;i++)
    #define FF(i,a,b) for (int i=a;i<=b;i++)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 1e3+10;
    
    int father[N];
    int Find(int c)
    {
        int p=c,i=c,j;
        while(father[p]!=p)  p=father[p];
        while(father[i]!=p) {
            j=father[i], father[i]=p, i=j;
        }
        return p;
    }
    bool Unite(int u,int v)
    {
        int fau=Find(u), fav=Find(v);
        if(fau!=fav) { father[fav]=fau; return true; }
        return false;
    }
    
    int degree[N];
    int main()
    {
        int n, m;
        while(scanf("%d", &n) && n) {
            scanf("%d", &m);
            mes(degree, 0);
            FF(i,1,n) father[i]=i;
            FF(i,1,m) {
                int u, v;
                scanf("%d%d", &u, &v);
                if(u!=v) {
                    degree[u]++, degree[v]++;
                    if(Unite(u, v)) ;
                }
            }
            int flag=0, cnt=0;
            FF(i,1,n) if(degree[i]&1) flag=1;
            FF(i,1,n) if(father[i]==i) cnt++;
            if(flag || cnt>1) puts("0");
            else puts("1");
        }
    
        return 0;
    }
    HDU-1878
  • 相关阅读:
    javascript 日期月份加减
    ActiveRecord 的类型初始值设定项引发异常
    angularjs $q、$http 处理多个异步请求
    angular.foreach 格式
    PHP基础知识2
    第一个月的学习总结
    JavaScript的学习5
    JavaScript的学习4
    JavaScript的学习3
    JavaScript的学习2
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6349957.html
Copyright © 2011-2022 走看看