算法复习——欧拉回路(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).哈夫曼树是带权路径长度最短的树,权值较大 ...
随机推荐
- 监控系统cpu相关统计信息
背景:需要测试监控各个操作系统平台机器上的cpu相关的各种统计信息 为了方便测试,我写了一个比较通用的shell脚本,目前可以兼容Redhat6+,Redhat7+,其他操作系统没测,可以实时监控机器 ...
- 前端开发工程师 - 02.JavaScript程序设计 - 期末考试
期末考试客观题 期末考试主观题 https://www.15yan.com/story/aY0HWAQ7oNU/ 1(8分) 函数myType用于根据输入参数返回相应的类型信息. 语法如下: ...
- STL之--插入迭代器(back_inserter,inserter,front_inserter的区别)
除了普通迭代器,C++标准模板库还定义了几种特殊的迭代器,分别是插入迭代器.流迭代器.反向迭代器和移动迭代器,定义在<iterator>头文件中,下面主要介绍三种插入迭代器(back_in ...
- leetcode-分割回文子串
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa",&quo ...
- jmeter使用复习
多终端进程: 配置客户端远程的ip地址和port 在客户端jmeter安装目录的bin目录下,修改配置文件 jmeter.properties 默认的remote_hosts 的值:(将肉鸡的地址加入 ...
- 详解Jedis连接池报错处理
在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...
- jstat命令
jstat命令使用 jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意:使用的jdk版本是 ...
- vue学习笔记(五):对于vuex的理解 + 简单实例
优点:通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护.使用vuex来引入外部状态管理,将业务逻辑切分到组件外,可以避免重复的从服务端抓取数据. 详情请参考官 ...
- vim 删除文件全部内容
很多时候我们需要删除脚本文件全部内容, 重新再写入新的内容,进行其他的操作: 很多时候我们对应用程序的排错需要查看日志文件,然而日志中通常有许多我们以前的应用程序产生的日志,其他的日志过多的时候,有时 ...
- 如何设置windows 2003的最大远程连接数
在Windows 2003系统上的远程桌面实际上就是终端服务,虽然远程桌面最初在Windows XP上就已经存在,但由于Windows XP的远程桌面功能,只能提供一个用户使用计算机,因此使用率并不高 ...