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

时间: 2024-11-03 22:06:40

HDU-1878 判断无向图欧拉回路,水的相关文章

hdoj 1878 欧拉回路(无向图欧拉回路+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 思路分析:该问题给定一个无向图,要求判断该无向图是否存在欧拉回路:无向图判断存在欧拉回路的两个必要条件:该无向图为连通图且所有的结点的度数为偶数: 代码如下: #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX_N = 1000 + 10

HDU 1878 欧拉回路 (并查集+欧拉回路)

题目地址:HDU 1878 这个题要注意欧拉回路与欧拉通路的区别.在都保证连通性的前提下,欧拉回路要求每个点的度数都是偶数,而欧拉通路允许两个点的度数是奇数.所以这题用并查集判断连通性后判断下度数就可以了. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib

hdu 1878 欧拉回路 (欧拉回路)

//1.联通图 2.顶点度数都为偶数 ,则存在欧拉回路. # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int father[1010]; int vis[1010][1010],du[1010]; int find(int x) { if(father[x]==x) return x; return father[x]=find(father[x]

hdu 1878 欧拉回路+并查集

欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路. 无向图欧拉回路的判定:图连通:图中所有节点度均为偶数 有向图欧拉回路的判定:图连通:所有节点入度等于出度 这道题属于无向图,首先用并查集判断图的联通性,各点的度数用一个数组保存下来. 如果一个点的根结点和其他点的根结点不同,则图不联通,有点度数为奇数也不满足欧拉回路,则输出0,否则输出1. 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath&g

[2016-01-21][HDU][1878]

/************************************************************* 时间:2016-01-20  15:00:34  星期三 题目编号:G HDU 1878 题目大意:给定一个图,判断是否是欧拉图 方法:         1.度数是偶数        2.连通量为1 判断连通量 可以 用 并查集 也可以dfs 解题过程遇到问题: *******************************************************

POJ 1041 John&#39;s trip (无向图欧拉回路)

John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7433   Accepted: 2465   Special Judge Description Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his frien

HDU 4931 Happy Three Friends(水)

HDU 4931 Happy Three Friends 题目链接 题意:6个数字,一个取两个,妹子取三个,问最后谁会赢 思路:排个序,判断前两个和3 - 5个的和谁更大即可 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int t, a[6]; int main() { scanf("%d&qu

HDU 4847 陕西邀请赛A(水)

HDU 4847 Wow! Such Doge! 题目链接 题意:给定文本,求有几个doge,不区分大小写 思路:水题,直接一个个读字符每次判断即可 代码: #include <stdio.h> #include <string.h> char c; char a[5]; int main() { a[5] = '\0'; int ans = 0; while ((c = getchar()) != EOF) { if (c >= 'a' && c <=

hdu 1251 统计难题 (map水过)

# include <stdio.h> # include <algorithm> # include <string.h> # include <map> # include <iostream> using namespace std; int main() { char a; string x; map<string,int>q; while(true) { scanf("%c",&a); if(a=