题目:

题解:

欧拉回路相关定理(相关定义和证明请参见其他资料):

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)的更多相关文章

  1. 算法复习——欧拉回路混合图(bzoj2095二分+网络流)

    题目: Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车 ...

  2. C#冒泡算法复习

    C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...

  3. C语言排序算法复习

    排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...

  4. KMP算法复习【+继续学习】

    离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...

  5. 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解

    问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...

  6. K-Means聚类和EM算法复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 k-means算法是一种得到最广泛使用的聚类算法. 它是将各个聚类子集内 ...

  7. 通过“回文字算法”复习C++语言。

    一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...

  8. 欧拉回路 uoj117

    写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...

  9. 【转】常用算法复习及实现(C++版)

    一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...

随机推荐

  1. Python2快速入门教程,只需要这十五张图片就够了!

    今天给大家分享的教程是适用于Python 2.7,但它可能适用于Python 2.Python 2.7将停止在2020中的支持. 与Python 2.7和3兼容的Python代码是完全可能的.通过使用 ...

  2. a链接传参的方法

    //获取分案编号 var hrefVal=window.location.href.split("?")[1]; //得到id=楼主 //console.log(hrefVal+& ...

  3. 《Effective C++》读书笔记 被你忽略的关于构造析构赋值

    如果程序员没有定义,那么编译器会默认隐式为你创建一个copy构造函数,一个copy赋值操作符,一个析构函数.另外如果你没有声明任何构造函数,编译器会为你声明一个default构造函数. 但是只有当这些 ...

  4. Java内存管理特点

    Java内存管理特点     Java一个最大的优点就是取消了指针,由垃圾收集器来自动管理内存的回收.程序员不需要通过调用函数来释放内存. 1.Java的内存管理就是对象的分配和释放问题.     在 ...

  5. selenium元素定位不到之iframe---基于python

    我们在使用selenium的18中定位方式的时候,有时会遇到定位不上的问题,今天我们就来说说导致定位不上的其中一个原因---iframe 问题描述:通过firebug查询到相应元素的id或name等, ...

  6. HDU 1007 Quoit Design(计算几何の最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  7. 个人在git配置SSH Key遇到的问题以及解决方案

    第一次用git上传代码到github,在这过程中遇到很多问题,在输入git命令的时候都小心翼翼,因为一不小心感觉就会出错.. 英语不好..在敲入git命令过程中各种错误提示勉强翻译下才看得懂 最后输入 ...

  8. MyEclipse2013使用总结

    1.myeclipse10中怎样将建的包设置成树形结构或者并列结构. 右上边三角那里进去设置选第一个是显示完整的包名,第二个显示的是树形结构这种方法没效 2.从高版本到项目的低版本的MyEclipse ...

  9. CSS基础小记

    2017/10/29 CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字 ...

  10. Android蓝牙开发浅谈(转)

    http://www.eoeandroid.com/thread-18993-1-1.html 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少     A ...