题意:

判断一个图是否是欧拉回路。

欧拉回路:

图 G 的一个回路,若它通过 G 中每条边一次且仅一次,则称为欧拉回路。

其中有著名的哥尼斯堡七桥问题或一笔画问题。(原来小时候我们就接触欧拉回路了,欧拉回路还是蛮常见,蛮简单的)

解题思路:

只要每个点都有入度,出度,那么这个图就是一个欧拉回路。然后再用并查集判断一个图是否是连通的即可。

代码:

#include<iostream> 
using namespace std; 
 
const int MAX=1005; 
 
int dep[MAX],father[MAX],du[MAX]; 
 
int find_set(int x) 

    if(x!=father[x]) 
    { 
        father[x]=find_set(father[x]);//回溯压缩路径 
    } 
    /*所有的子节点的根都归到boss下*/ 
    return father[x]; 

 
void union_set(int f1,int f2) 

    f1=find_set(f1); 
    f2=find_set(f2); 
    if(f1==f2) 
        return ; 
    if(dep[f1]>dep[f2]) 
    { 
        father[f2]=f1; 
    } 
    else 
    { 
        if(dep[f1]==dep[f2]) 
        { 
            dep[f2]++; 
        } 
        father[f1]=f2; 
    } 
    return ; 

 
void init(int n) 

    for(int i=0;i<=n;i++) 
    { 
        father[i]=i; 
        dep[i]=0; 
    } 
    memset(du,0,sizeof(du)); 

 
int main(void) 

    int point,edge; 
    int count,i,u,v; 
    bool exist; 
    while(scanf("%d",&point),point) 
    { 
        scanf("%d",&edge); 
        init(point); 
        for(i=0;i<edge;i++) 
        { 
            scanf("%d%d",&u,&v); 
            du[u]++; 
            du[v]++; 
            union_set(u,v);        
        } 
        exist=1; 
        for(i=0;i<=point;i++) 
        { 
            if(du[i]&&du[i]%2!=0) 
            { 
             
                exist=0;     
                break; 
            } 
         
        } 
        for(i=0,count=0;i<=point;i++) 
        { 
            if(du[i]&&i==find_set(i)) 
                count++; 
        } 
        if(exist) 
        { 
            if(count!=1) 
                cout<<"0"<<endl; 
            else 
                cout<<"1"<<endl; 
        } 
        else 
            cout<<"0"<<endl; 
    } 
    return 0; 

转载于:https://www.cnblogs.com/cchun/archive/2011/08/20/2520119.html

HDU1878-欧拉回路(入门题+并查集)相关推荐

  1. C#LeetCode刷题-并查集

    并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列 39.3% 困难 130 被围绕的区域 30.5% 中等 200 岛屿的个数 38.4% 中等 547 朋友圈 45.1% 中等 684 ...

  2. 图论500题 ---- 并查集求路径上最大值最小不超过K的点对数 HDU Portal

    题目链接 题目大意: 就给你一个图,qqq次询问,问你这个图上有多少对点之间的所以路径上的最大值的最小值不超过kkk? 解题思路: 首先我们知道这本质上就是求两个点联通的路径上的最大值最小是多少? 那 ...

  3. C. Edgy Trees---(思维题+并查集的运用)---Codeforces Round #548 (Div. 2)

    Edgy Trees time limit per test 2 seconds memory limit per test 256 megabytes 题目链接http://codeforces.c ...

  4. 图论500题 ---- 并查集+树形dp+枚举 求解动态的最小生成树 HDU 4126

    题目链接 题目大意: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边(可以经过可疑边新的花费构建的边),注意每次只出现一条 ...

  5. 【蓝桥杯】考前押题--并查集

  6. 并查集hdu1232

    应该是最主要的题 開始还是没有理解透彻 没有理解透彻就不要急着做题 并查集说白了就是把全部的点看看能归成几个集 合 所以首先推断这两点是否在一个集合范围内 假设没在一个集合范围内 就把小的集合赋给大的 ...

  7. HDU1856More is better(并查集)

    最近发现以前的东西都忘得差不多了,在这里刷刷水题 并查集: 1 int find_parent(int x) 2 { 3 return x = p[x] ? x : p[x] = find_paren ...

  8. 解决连通性问题的利器:并查集

    解决连通性问题的利器:并查集 提示:但凡设计连通性的事情,通通可以用一个利器解决:并查集 今天这篇是第一篇关于连通性的基础,今后遇到题目,我会整理出来,放一起,让你看到并查集的功能有多么强大! 文章目 ...

  9. HDU1878 欧拉回路【并查集】

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

最新文章

  1. 全国大学生智能汽车竞赛获奖证书文字
  2. jquery无法删除一级域名cookie
  3. java对.txt文件进行读取方法实战---室友是网络安全方向,帮他提取文件里的特定ip
  4. learn go anonymous function
  5. 无线网的组建与应用习题参考答案
  6. 带你一起学软件工程的专业英语!(IT行业、四六级党快记起来)《软件工程专业英语》第一单元:启动软件项目——单词、短语、名词缩写、难句、备忘录的基本格式样本(必备技能)
  7. c++基于asio的组播:windows linux通信
  8. linux下编辑文件实验,Linux上最常用的文本编辑器vi/vim使用教程
  9. for命令linux,linux命令:for循环(示例代码)
  10. 基因表达式编程的任务指派问题求解算法设计与实现
  11. C++复合类型-指针变量
  12. 判定树与判定表的定义与相关练习
  13. 邮箱注册哪个好?哪家的邮箱最好用呀
  14. 谷歌是如何以简洁赢取用户的
  15. k个一组翻转链表 哔哩哔哩2020校园招聘笔试题/LeetCode_25(困难)讲解
  16. MediaPlayer+SurfaceView实现视频播放器
  17. 看看什么叫老牛吃嫩草
  18. Android开发范例实战宝典
  19. validate格式校验之身份证号码校验
  20. 人物的喜怒哀乐怎么画?动漫人物表情怎么画?

热门文章

  1. LeetCode 1880. 检查某单词是否等于两单词之和
  2. LeetCode 1704. 判断字符串的两半是否相似
  3. LeetCode 1219. 黄金矿工(回溯)
  4. LeetCode 219. 存在重复元素 II(哈希)
  5. Redis常用数据类型的数据结构
  6. 聚类算法 距离矩阵_快速且不需要超参的无监督聚类方法
  7. 数字逻辑基础与verilog设计_数字电路学习笔记(五):逻辑设计基础
  8. for循环利用可迭代对象与迭代器完成工作的本质
  9. mysql5.7.17二进制包_mysql5.7二进制包安装方法
  10. 为什么回归问题用MSE?