题目链接:传送门

思路:

(1)用邻接表存储有向图和无向图,有向图和无向图的每条边均站两个单元,无向图有正向边和反向边的区分。

(2)有向图有欧拉回路:所有点的入度=出度;

无向图有欧拉回路:所有点的度数之和是2的倍数。

(3)搜索时要从存在的点开始搜索,注意每条边站两个单位,所以i/2。

(4)搜索的结果路径必须包含所有边,如果图不连通则不行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = ;
struct Node{
int to,next,val;
}edge[maxn*];
int vis[maxn],head[maxn],IN[maxn],OUT[maxn],tot;
vector <int> ans;
void Init()
{
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));
memset(IN,,sizeof(IN));
memset(OUT,,sizeof(OUT));
tot=;ans.clear();
}
void addedge(int u,int v,int w)
{
edge[tot].to=v;
edge[tot].next=head[u];
edge[tot].val=w;
head[u]=tot++;
}
void dfs(int u)
{
for(int &i=head[u];i;i=edge[i].next){ //对i引用,提高速度
Node tmp=edge[i];
if(!vis[i>>]){
vis[i>>]=;
dfs(tmp.to);
ans.push_back(tmp.val);
}
}
}
int main(void)
{
int n,m,i,j,x,y,type,fg=;
scanf("%d%d%d",&type,&n,&m);
Init();
for(i=;i<=m;i++){
scanf("%d%d",&x,&y);
addedge(x,y,i);
IN[y]++;OUT[x]++;
if(type==) addedge(y,x,-i);
else tot++;
} if(type==){
for(i=;i<=n;i++)
if((IN[i]+OUT[i])%){
fg=;break;
}
}else{
for(i=;i<=n;i++)
if(IN[i]!=OUT[i]){
fg=;break;
}
} if(fg){
for(i=;i<=n;i++) //找到图中存在的点
if(head[i]){
dfs(i);break;
}
if(ans.size()!=m) printf("NO\n");
else{
printf("YES\n");
for(i=m-;i>=;i--){
if(i!=m-) printf(" ");
printf("%d",ans[i]); //ans相当于栈,所以倒叙输出
}
}
}else printf("NO\n");
return ;
}

参考文章:传送门

LOJ-10105(欧拉回路模板,套圈法,递归)的更多相关文章

  1. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  2. UVA10054-The Necklace(无向图欧拉回路——套圈算法)

    Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...

  3. uva11549 Floyd判圈法

    题意: 给两个数n, k,每次将k平方取k的前n位,问所有出现过的数的最大值 原来这就是floyd判圈法.. #include<cstdio> #include<cstdlib> ...

  4. 破圈法求解最小生成树c语言实现(已验证)

    破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...

  5. POJ 2135.Farm Tour 消负圈法最小费用最大流

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4914   Accepted: 1284   ...

  6. CF F. MST Unification (最小生成树避圈法)

    题意 给一个无向加权联通图,没有重边和环.在这个图中可能存在多个最小生成树(MST),你可以进行以下操作:选择某条边使其权值加一,使得MST权值不变且唯一.求最少的操作次数. 分系:首先我们先要知道为 ...

  7. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  8. 聊聊 C# 和 C++ 中的 泛型模板 底层玩法

    最近在看 C++ 的方法和类模板,我就在想 C# 中也是有这个概念的,不过叫法不一样,人家叫模板,我们叫泛型,哈哈,有点意思,这一篇我们来聊聊它们底层是怎么玩的? 一:C++ 中的模板玩法 毕竟 C+ ...

  9. hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

     题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...

随机推荐

  1. pygame 简单播放音乐程序

    环境: python2.7 pygame 功能: 播放指定目录下的歌曲(暂时mp3),可以上一曲.下一曲播放. 文件目录: font  字体文件夹 image  图片文件夹 music  音乐文件夹 ...

  2. WPF 重写ListBox(透明效果)

    <UserControl d:DesignHeight="460" d:DesignWidth="300" x:Name="UCcontrol& ...

  3. Dubbo源码分析

    Dubbo源码分析1 Dubbo源码分析2 dubbo源码阅读:rpc请求处理流程(1) 架构设计:系统间通信(17)——服务治理与Dubbo 中篇(分析) 13. Dubbo原理解析-注册中心之Zo ...

  4. 性能监控工具以及java堆分析OOM

      一.性能监控工具 1.系统性能监控 Linux -确定系统运行的整体状态,基本定位问题所在 -uptime: ------系统时间 ------运行时间(例子中为127天) ------连接数(每 ...

  5. Java 学习 UUID 与 时间格式化、时间操作

    UUID : UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分.其目的,是让分 ...

  6. 1816647 - Error "Data file of SAP Note is incomplete" uploading a note in SNOTE

    ymptom When uploading an SAP Note in transaction SNOTE you receive the error "Data file of SAP ...

  7. RF:操作笔记

    1.变量运算

  8. python中configpraser模块

    configparser   模块 解析配置文件模块 什么是配置文件? 用于编写程序的配置信息的文件 什么是配置信息? 为了提高程序的扩展性 #configparser模块的使用 #首先我们需要知道配 ...

  9. Java中的反射总结

    反射是获取运行时类信息,即常量区中的Class信息. 要获取类信息,必然需要依据,不然系统怎么指定你要获取那个类信息, 类信息在java中就是Class类的一个对象,它是一个java类抽象,换句话说它 ...

  10. 前端 搜索样式 html

    原文:https://blog.csdn.net/linlinxie/article/details/77484214?utm_source=blogkpcl4 测试1: <div class= ...