题目:

题解:

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

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. jmeter属性设置

    使用${__setProperty(newuserid,1,)}函数对属性进行设置 2.使用${__P(userid)}函数在其他线程组中引用该属性 备注: 1.JMeter属性在测试脚本的任何地方都 ...

  2. js 加密 crypto-js des加密

    js 加密 crypto-js    https://www.npmjs.com/package/crypto-js   DES  举例:   js 引入:   <script src=&quo ...

  3. ObjectMapper的使用

    Jackson ObjectMapper类 ObjectMapper类是Jackson库的主要类它提供一些功能将Java对象转换成JSON结构,反之亦然它使用JsonParser和JsonGenera ...

  4. numpy切片和布尔型索引

    numpy 标签(空格分隔): numpy 数据挖掘 切片 数组切片是原始数组的视图.这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上 In [16]: arr Out[16]: arr ...

  5. 特殊符号 & 以太坊

    &表示取二进制的末尾 &1表示如果末尾是奇数和偶数两种情况 0 偶数 1奇数 举例子: int a=1;int p=&a; 其中,p是指针,&a就是将a在内存中的实际地 ...

  6. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  7. 图的遍历——BFS(队列实现)

    #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> ...

  8. freefcw/hustoj Install Guide

    First of all, this version hustoj is a skin and improved for https://code.google.com/p/hustoj/. So t ...

  9. ACM 第十二天

    博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈,SG函数,SG定理) 一.  巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关 ...

  10. iOS-开发将文本复制到剪切板

    下面方法可以将文本复制到剪切板 UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = @"邀请码& ...