hdu 1878 欧拉回路

欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。

Output

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。

Sample Input

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output

1
0

Author

ZJU

Source

浙大计算机研究生复试上机考试-2008年

欧拉回路百度百科

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define esp 0.00000000001
const int N=1e3+10,M=1e6+10,inf=1e9;
int fa[N],du[N],flag[N];
int Find(int x)
{
    return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void update(int u,int v)
{
    int x=Find(u);
    int y=Find(v);
    if(x!=y)
    {
        fa[x]=y;
    }
}
void init()
{
    for(int i=0;i<=1000;i++)
        fa[i]=i;
    memset(du,0,sizeof(du));
}
int main()
{
    int n,m;
    while(~scanf("%d",&n))
    {
        init();
        int p;
        if(n==0)break;
        scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            update(u,v);
            du[u]++;
            du[v]++;
            p=Find(u);
        }
        int ans=1;
        for(int i=1;i<=n;i++)
        {
            if(du[i]==0)continue;
            int k=Find(i);
            if(k!=p||du[i]%2)
            {
                ans=0;
                break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-08-17 11:09:54

hdu 1878 欧拉回路的相关文章

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 欧拉回路 (并查集+欧拉回路)

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

HDU 1878.欧拉回路【欧拉路及欧拉回路初接触】【8月2】

欧拉回路 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结 束. Output 每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0.

hdu 1878 欧拉回路 水题。测试数据貌似有点问题

欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10135    Accepted Submission(s): 3708 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例

hdu 1878 欧拉回路+并查集

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

[ ACM ] Hdu 1878 欧拉回路

欧拉通路:图中所有的节点的度都是偶数. 所以只需要记一下每个点出现的次数即可. 有一种像下面的特例(n==6):  1       4 / \     / \ 2---3   5---6虽然每个节点的度都是2,但分成了两部分. 所以,还要用并查集判断一下. 1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN=1000+5; 5 const int INF=100000000; 6 7 int node[MAXN];

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

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

HDU 2894 欧拉回路

#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define N 20020 struct node{ int from, to, dou, nex; }edge[N]; int head[N], edgenum; void add(int u, int v,int dou)

HDU ACM 1878欧拉回路

欧拉回路的判断: 1.若有一个节点的度为奇数,则不能构成欧拉回路: 2.判断所有点是否可以一笔通过并回到起点. #include<iostream> using namespace std; #define N 1005 int deg[N]; //每个节点的度 bool vis[N]; int map[N][N]; bool DegValid(int n) { for(int i=1;i<=n;i++) if(deg[i]&1) return false; return tru