算法复习——欧拉回路(uoj117)
题目:
题解:
欧拉回路相关定理(相关定义和证明请参见其他资料):
1.欧拉回路
(1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件。
(2)无向图:所有点的度都为偶数为该图为欧拉图(存在欧拉回路)的充要条件。
2.欧拉通路
(1)有向图:除两点(其中一点出度+1==入度,另一点入度+1==出度)另外点出度都等于入度为该图为半欧拉图(存在欧拉通路)的充要条件。
(2)无向图:除两点(两点度都为奇数)另外点的度都为偶数为该图为半欧拉图(存在欧拉通路)的充要条件。
以上定理用于判断是否为存在欧拉回路或者通路
接下来是两个推论:
嗯就是这样··再回到这道题上,一道很裸地模版题···然而被uoj大佬的数据教做人··
注意判定重边不然就会超时·····用类似于网络流的cur来优化(具体见代码)
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<ctime>
- #include<cctype>
- #include<cstring>
- #include<string>
- #include<algorithm>
- using namespace std;
- const int N=1e5+;
- const int M=5e5+;
- int first[N],go[M*],next[M*],tot=;
- int n,m,T,ru[N],chu[N],stack[M*],cnt;
- bool visit[M];
- inline void comb(int a,int b)
- {
- next[++tot]=first[a],first[a]=tot,go[tot]=b;
- }
- inline void dfs1(int u)
- {
- for(int &e=first[u];e;e=next[e])
- {
- if(!visit[e])
- {
- visit[e]=true;
- if(e%==)
- visit[e+]=true;
- else
- visit[e-]=true;
- int t=e;
- dfs1(go[e]);
- stack[++cnt]=t;
- }
- }
- }
- inline void dfs2(int u)
- {
- for(int &e=first[u];e;e=next[e])
- {
- if(!visit[e])
- {
- visit[e]=true;
- int t=e;
- dfs2(go[e]);
- stack[++cnt]=t;
- }
- }
- }
- int main()
- {
- //freopen("a.in","r",stdin);
- scanf("%d",&T);
- int a,b;
- scanf("%d%d",&n,&m);
- if(T==) //无向图情况
- {
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&a,&b);
- comb(a,b);
- comb(b,a);
- ru[b]++;
- chu[a]++;
- }
- for(int i=;i<=n;i++)
- if((ru[i]+chu[i])%==)
- {
- cout<<"NO"<<endl;
- return ;
- }
- for(int i=;i<=n;i++)
- {
- if(first[i])
- {
- dfs1(i);
- break;
- }
- }
- if(cnt!=m)
- {
- cout<<"NO"<<endl;
- return ;
- }
- cout<<"YES"<<endl;
- for(int i=cnt;i>=;i--)
- {
- if(stack[i]%==)
- cout<<(stack[i]+)/<<" ";
- else
- cout<<stack[i]/*(-)<<" ";
- }
- return ;
- }
- else
- {
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&a,&b);
- comb(a,b);
- ru[b]++;
- chu[a]++;
- }
- for(int i=;i<=n;i++)
- if(ru[i]!=chu[i])
- {
- cout<<"NO"<<endl;
- return ;
- }
- for(int i=;i<=n;i++)
- {
- if(first[i])
- {
- dfs2(i);
- break;
- }
- }
- if(cnt!=m)
- {
- cout<<"NO"<<endl;
- return ;
- }
- cout<<"YES"<<endl;
- for(int i=cnt;i>=;i--)
- cout<<stack[i]<<" ";
- return ;
- }
- }
算法复习——欧拉回路(uoj117)的更多相关文章
- 算法复习——欧拉回路混合图(bzoj2095二分+网络流)
题目: Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车 ...
- C#冒泡算法复习
C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- KMP算法复习【+继续学习】
离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- K-Means聚类和EM算法复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 k-means算法是一种得到最广泛使用的聚类算法. 它是将各个聚类子集内 ...
- 通过“回文字算法”复习C++语言。
一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...
- 欧拉回路 uoj117
写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...
- 【转】常用算法复习及实现(C++版)
一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...
随机推荐
- 180710-MySql插入唯一键冲突的三种可选方式
MySql插入时唯一键冲突的几种处理方式 MySql插入一条记录,结果提示主键冲突,怎么办? 批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法 ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第2章.HTTP协议简介
第2章--HTTP协议简介 HTTP协议简介 Abstract: HTTP协议的特性,HTTP请求/响应的过程,HTTP请求/响应的报文格式等知识,最后会演示如何通过Chrome提供的开发者工具,去跟 ...
- HTML+JS = 网站注册界面源代码
本注册页面未设置编码方式和兼容性,已测试,在Chrome浏览器显示正常 <!DOCTYPE html> <html> <head> <title>注册页 ...
- 爬虫1.6-selenium+HeadlessChrome
目录 爬虫-selenium+HeadlessChrome 1. 浏览器处理步骤 2. headless-chrome初体验 3. 实战爬取淘宝镇.街道信息 爬虫-selenium+HeadlessC ...
- NOIP2012 普及组真题 4.13校模拟
考试状态: 我今天抽签看了洛谷的… 这我能怂???凶中带吉,我怕考试??我!不!怕! 看着整个机房的男同学们,我明白我是不会触发我的忌了.很好,开刷. A. [NOIP2012普及组真题] 质因数分解 ...
- LeetCode 108——将有序数组转化为二叉搜索树
1. 题目 2. 解答 一棵高度平衡的二叉搜索树意味着根节点的左右子树包含相同数量的节点,也就是根节点为有序数组的中值. 因此,我们将数组的中值作为根节点,然后再递归分别得到左半部分数据转化的左子树和 ...
- opencv-学习笔记(2)
opencv-学习笔记(2) 这章记录了 获取像素点,改变像素点 获取图像的属性(行,列,通道数,数据类型) roi感应区 拆分以及合并图像通道 边缘扩充 opencv获取像素点,改变像素点 ---- ...
- SIG蓝牙mesh笔记5_Provisionging
目录 Bluetooth Mesh Provisioning Provisioning bearer layer Generic Provisioning PDU Bluetooth Mesh Pro ...
- POJ 1696 Space Ant(凸包变形)
Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scie ...
- HDU 2494/POJ 3930 Elevator(模拟)(2008 Asia Regional Beijing)
Description Too worrying about the house price bubble, poor Mike sold his house and rent an apartmen ...