#117. 欧拉回路

题目描述

有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。

一共两个子任务:

  1. 这张图是无向图。(50分)
  2. 这张图是有向图。(50分)

输入格式

第一行一个整数 tt,表示子任务编号。t∈{1,2}t∈{1,2},如果 t=1t=1 则表示处理无向图的情况,如果 t=2t=2 则表示处理有向图的情况。

第二行两个整数 n,mn,m,表示图的结点数和边数。

接下来 mm 行中,第 ii 行两个整数 vi,uivi,ui,表示第 ii 条边(从 11 开始编号)。保证 1≤vi,ui≤n1≤vi,ui≤n。

  1. 如果 t=1t=1 则表示 vivi 到 uiui 有一条无向边。
  2. 如果 t=2t=2 则表示 vivi 到 uiui 有一条有向边。

图中可能有重边也可能有自环。

输出格式

如果不可以一笔画,输出一行 “NO”。

否则,输出一行 “YES”,接下来一行输出一组方案。

  1. 如果 t=1t=1,输出 mm 个整数 p1,p2,…,pmp1,p2,…,pm。令 e=∣pi∣e=∣pi∣,那么 ee 表示经过的第 ii 条边的编号。如果 pipi 为正数表示从 veve 走到 ueue,否则表示从 ueue 走到 veve。
  2. 如果 t=2t=2,输出 mm 个整数 p1,p2,…,pmp1,p2,…,pm。其中 pipi 表示经过的第 ii 条边的编号。

样例一

input

1
3 3
1 2
2 3
1 3

output

YES
1 2 -3

样例二

input

2
5 6
2 3
2 5
3 4
1 2
4 2
5 1

output

YES
4 1 3 5 2 6

限制与约定

1≤n≤105,0≤m≤2×1051≤n≤105,0≤m≤2×105

时间限制:1s1s

空间限制:256MB

说是模板题,然而并不容易写啊~坑的数据太多。。。

要进行各种优化。。。不然会TLE。。。UOJ Extra Test 也有一组坑点,一定要注意下!

另外:本题有重边和自环。。。

代码用的是基本法(套圈)蛤蛤蛤

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<map>
using namespace std; int t,n,m,x,y,cur;
int head[1000010],sum[1000010],adj[1000010],cnt=1;
bool vis[1000010];
struct sdt
{
int u,v,nxt;
}e[4001000];
stack<int>s; inline int read()
{
int x=0;char c=getchar();
while(c<48||c>57)c=getchar();
while(c>47&&c<58)x*=10,x+=c-48,c=getchar();
return x;
} inline void add(int x,int y)
{
e[++cnt].u=x;
e[cnt].v=y;
e[cnt].nxt=head[x];
head[x]=cnt;
adj[x]=head[x];
} inline int gets(int x)
{
return x%2==0 ? x/2 : -x/2 ;
} void dfs1(int x)
{
while(adj[x])
{
if(!vis[adj[x]])
{
vis[adj[x]]=1;
vis[adj[x]^1]=1;
int k=adj[x];
dfs1(e[k].v);
s.push(gets(k));
cur++;
}
else adj[x]=e[adj[x]].nxt;
}
} inline bool solve1()
{
n=read();
m=read();
for(int i=1;i<=m;i++)
{
x=read();
y=read();
add(x,y);
add(y,x);
sum[x]++;
sum[y]++;
}
for(int i=1;i<=n;i++)
{
if(sum[i]%2)return 0;
}
for(int i=1;i<=n;i++)
{
if(sum[i])
{
dfs1(i);
break;
}
}
if(cur!=m)return 0; else return 1;
} void dfs2(int x)
{
while(adj[x])
{
if(!vis[adj[x]])
{
vis[adj[x]]=1;
int k=adj[x];
dfs2(e[k].v);
s.push(k-1);
cur++;
}
else adj[x]=e[adj[x]].nxt;
}
} inline bool solve2()
{
n=read();
m=read();
for(int i=1;i<=m;i++)
{
x=read();
y=read();
add(x,y);
sum[x]++;
sum[y]--;
}
for(int i=1;i<=n;i++)
{
if(sum[i])return 0;
}
for(int i=1;i<=n;i++)
{
if(head[i])
{
dfs2(i);
break;
}
}
if(cur!=cnt-1)return 0; else return 1;
} int main()
{
t=read();
if(t==1)
{
if(solve1()==0)
{
printf("NO\n");
return 0;
}
else
{
printf("YES\n");
while(!s.empty())
{
printf("%d ",s.top());
s.pop();
}
printf("\n");
}
}
else
{
if(solve2()==0)
{
printf("NO\n");
return 0;
}
else
{
printf("YES\n");
while(!s.empty())
{
printf("%d ",s.top());
s.pop();
}
printf("\n");
}
}
return 0;
}

  

UOJ#117. 欧拉回路的更多相关文章

  1. 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)

    原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...

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

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

  3. 【UOJ 117】欧拉回路

    #117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...

  4. 「UOJ#117」 欧拉回路

    欧拉回路 - 题目 - Universal Online Judge 题意: 给定有向图或无向图,求一条欧拉回路. 题解 心路历程:woc什么傻哔东西->哇真香我的吗!(逃 首先我知道很多人把欧 ...

  5. 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)

    [UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...

  6. 【UOJ#177】欧拉回路

    [UOJ#177]欧拉回路 题面 UOJ 题解 首先图不连通就没啥好搞的了. 对于无向图而言,每个点度数为偶数. 对于有向图而言,每个点入度等于出度. 然后就是一本通上有的做法,直接\(dfs\)一遍 ...

  7. 【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)

    [UOJ#389][UNR#3]白鸽(欧拉回路,费用流) 题面 UOJ 题解 首先第一问就是判断是否存在一条合法的欧拉回路,这个拿度数和连通性判断一下就行了. 第二问判断转的圈数,显然我们只需要考虑顺 ...

  8. UOJ117:欧拉回路——题解

    http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...

  9. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

随机推荐

  1. Google Dataflow

    十分钟了解分布式计算:Google Dataflow 介绍 Google Cloud Dataflow是一种构建.管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Fl ...

  2. [转]【Android】9-patch图片以及例子说明

    1.何为9-patch? NinePatch图片以*.9.png结尾,和普通图片(png图片)的区别是四周多了一个边框(如下图所示): 采用NinePatch图片做背景,可使背景随着内容的拉伸(缩小) ...

  3. Ubuntu下安装Intel Fortran编译器(ifort)

    Intel Fortan Compiler简称ifort, Windows下的ifort是收费的,但是Linux系统下提供免费的ifort,可以在下面的链接中下载需要的版本(必须先注册,随后会收到官网 ...

  4. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  5. 笔试总结篇(一) : 广州X公司笔试

    一.单选题: Ps : 当时由于去广州路上颠簸很困,导致刚做几分钟题目就睡了一觉.起来发现20分钟过去了.擦擦! 1. 假设磁盘文件foobar.txt 由 6个ASCII 码字符“foobar” 组 ...

  6. ODP.NET

    1,什么是ODT?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 A ...

  7. JavaScript模板引擎原理

    JavaScript模板引擎原理,几行代码的事儿 2013-12-03 16:35 by BarretLee, 650 阅读, 6 评论, 收藏, 编辑 一.前言 什么是模板引擎,说的简单点,就是一个 ...

  8. vj1010:高精乘+细心模拟

    这题的话思路挺简单的,主要是打一个高精乘,然后考虑一些细节的东西 码得挺少时间的,但是调错调了很久... 讲一下思路吧: 就是读入的时候,先把小数点去掉,mark一下小数点的位置 去掉小数点之后也就进 ...

  9. C语言实现进制转换——超图面试题

    递归:递归的原理,就是自己调用自己本身.存在一个顺序的问题,如果在递归前的是顺序执行,递归后的是逆序执行,如下: void gogogo() { //递归之前 gogogo(); //递归之后 } 递 ...

  10. DevExpress 学习使用之 SplitContainerControl

    无论是 .net framework 自带还是第三方组件,使用 Split 类控件时通常其 Panel 中都会包含多个子控件,在运行时不可避免遇到因改变 splitter 位置或改变窗体大小引起的界面 ...