算法复习——欧拉回路(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).哈夫曼树是带权路径长度最短的树,权值较大 ...
随机推荐
- Appium-测试失败后屏幕截图的
本文参考:http://www.cnblogs.com/hexianl/p/4958556.html 使用testng测试框架进行管理测试 1.创建监听,代码如下: import io.appium. ...
- Resharp使用简记
一图流: 拾贝: .字符串引号中直接回车键自动添加连接字符串 Ctrl+B:转到定义 Ctr+F11:展示类结构 Ctr+Alt+j:包围代码块 Ctr+\:注释和取消注释 Alt+Ins:重构 Ct ...
- 前端开发工程师 - 05.产品前端架构 - 协作流程 & 接口设计 & 版本管理 & 技术选型 &开发实践
05.产品前端架构 第1章--协作流程 WEB系统 角色定义 协作流程 职责说明 第2章--接口设计 概述 接口规范 规范应用 本地开发 第3章--版本管理 见 Java开发工程师(Web方向) - ...
- 简单的图片滑动效果插件 jQuery.iocnSlider.js
近几日在制作一个客户引导页面,其中有一个图片展示而且带滑动的效果.好久没练手了,索性自己写一个插件吧. 依据设计原型,需要满足两套分辨率下图片不同的尺寸,所以在css中使用了media query的相 ...
- Python变量常量及注释
一.变量命名规则1.有字母.数字.下划线搭配组合而成2.不能以数字开头,更不能全为数字3.不能用Python的关键字4.不要太长5.名字要有意义6.不要用中文7.区分大小写8.采用驼峰体命名(多个单词 ...
- Leetcode - 557. Reverse Words in a String III (C++) stringstream
1. 题目:https://leetcode.com/problems/reverse-words-in-a-string-iii/discuss/ 反转字符串中的所有单词. 2. 思路: 这题主要是 ...
- android4.3 Bluetooth分析之扫描分析
android4.3中引入了蓝牙低能耗le(low energy),相应的也有一些方法/类.不过代码里,并没有找到初始调用的地方.所以这里还是先只分析下bt普通的扫描流程(类似android 4.2) ...
- MyEclipse2013使用总结
1.myeclipse10中怎样将建的包设置成树形结构或者并列结构. 右上边三角那里进去设置选第一个是显示完整的包名,第二个显示的是树形结构这种方法没效 2.从高版本到项目的低版本的MyEclipse ...
- iOS- <项目笔记>UI控件常见属性总结
1.UIView // 如果userInteractionEnabled=NO,不能跟用户交互 @property(nonatomic,getter=isUserInteractionEnabled) ...
- iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别
1.JSON (基本上移动开发的主要数据传输都是JSON) 1.1.JSON特点: a.[] 表示数组 b.{} 表示字典 - 对象模型建立关系 c.应用非常多,基本上移动开发的主要数据传输都是JSO ...