hdu1878-并查集,欧拉回路

纯裸题。。写着方便理解。。。

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

解题思路:并查集判断一下是否联通,然后再判断一下点的度数是否为偶数就行了;

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define maxn 2010
using namespace std;
int f[maxn];
int findf(int x)
{
    if(f[x]==x)
        return x;
    else return findf(f[x]);
}
void join(int x,int y)
{
    int t1,t2;
    t1=findf(x);
    t2=findf(y);
    if(t1!=t2)
        f[t2]=t1;
}
int main()
{
    int n;
    int degree[maxn];
    int m;
    int cnt;
    int x,y;
    int flag;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0)
            break;
        cnt=0,flag=0;
        memset(degree,0,sizeof(degree));
        for(int i=1;i<=n;i++)
            f[i]=i;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            join(x,y);
            degree[y]++;
            degree[x]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(f[i]==i)
                cnt++;
        }
        for(int i=1;i<=n;i++)
        {
            if(degree[i]%2==1)
                flag=1;
        }
        if(cnt==1&&flag==0)
            printf("1\n");
        else
            printf("0\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/huangdao/p/8451249.html

时间: 2024-08-30 14:42:23

hdu1878-并查集,欧拉回路的相关文章

并查集+欧拉回路+字典树 Colored Sticks POJ 2513

输入多组数据,每组数据两种颜色,表示一根木头两端的颜色,现在要将这些木头相连,要求相连部分颜色相同,问能否全部连通 提示 1)一个要判断所有的木头是否在一个集合中,即是否能相连 2)判断一种颜色出现的数量 3)一棵树如果只有0或2个点出现次数为奇数,则树可以一笔画成 #include <stdio.h> #include <string.h> #define maxn 500005 int tot; int f[maxn]; int num[maxn]; struct trie {

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

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

hdu1878 欧拉回路(并查集)

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

HDU1878——欧拉回路(并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1878 题意:这道题讲的是判断是否是一个欧拉回路. 欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路. 欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路. 无向图是否具有欧拉通路或回路的判定: 欧拉通路:图连通:图中只有0个或2个度为奇数的节点 欧拉回路:图连通:图中所有节点度均为偶数 有向图是否具有欧拉通路或回路的判定: 欧拉通路:图连通:除2个端点外其余节点入度=出度:1个端点入

hdu1878 欧拉回路 并查集

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

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

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

UVA - 10129 Play on Words(欧拉回路+并查集)

2.解题思路:本题利用欧拉回路存在条件解决.可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点.由于本题还要求了两个单词拼在一起的条件是前一个单词的右端点和本单词的左端点一样.所以这是一个有向图.根据结论:有向图的底图(忽略边的方向后的图)必须连通:有向图中最多只能有两个端点的入度不等于出度,且必须是其中一点的入度比出度小1,另一点的入度比出度大1.因此先判断端点是否都连通,再判断每个端点的度数是否满足结论即可. 那么,如何判断连通性呢?

ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Practice Description You have won a collection of tickets on luxury cruisers. Each ticket can be used only once, but can be used in either direction between

nyist 42 一笔画 (欧拉回路 + 并查集)

nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度

NYOJ42 一笔画问题 【欧拉回路】+【并查集】

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<