UOJ#117. 欧拉回路
#117. 欧拉回路
题目描述
有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
一共两个子任务:
- 这张图是无向图。(50分)
- 这张图是有向图。(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。
- 如果 t=1t=1 则表示 vivi 到 uiui 有一条无向边。
- 如果 t=2t=2 则表示 vivi 到 uiui 有一条有向边。
图中可能有重边也可能有自环。
输出格式
如果不可以一笔画,输出一行 “NO”。
否则,输出一行 “YES”,接下来一行输出一组方案。
- 如果 t=1t=1,输出 mm 个整数 p1,p2,…,pmp1,p2,…,pm。令 e=∣pi∣e=∣pi∣,那么 ee 表示经过的第 ii 条边的编号。如果 pipi 为正数表示从 veve 走到 ueue,否则表示从 ueue 走到 veve。
- 如果 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. 欧拉回路的更多相关文章
- 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)
原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...
- UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...
- 【UOJ 117】欧拉回路
#117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...
- 「UOJ#117」 欧拉回路
欧拉回路 - 题目 - Universal Online Judge 题意: 给定有向图或无向图,求一条欧拉回路. 题解 心路历程:woc什么傻哔东西->哇真香我的吗!(逃 首先我知道很多人把欧 ...
- 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
[UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...
- 【UOJ#177】欧拉回路
[UOJ#177]欧拉回路 题面 UOJ 题解 首先图不连通就没啥好搞的了. 对于无向图而言,每个点度数为偶数. 对于有向图而言,每个点入度等于出度. 然后就是一本通上有的做法,直接\(dfs\)一遍 ...
- 【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)
[UOJ#389][UNR#3]白鸽(欧拉回路,费用流) 题面 UOJ 题解 首先第一问就是判断是否存在一条合法的欧拉回路,这个拿度数和连通性判断一下就行了. 第二问判断转的圈数,显然我们只需要考虑顺 ...
- UOJ117:欧拉回路——题解
http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...
- UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]
UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...
随机推荐
- 《互联网初创企业password》书评
今天试用了一下<互联网初创企业password>这本书.我觉得这本书开始的很真实,从学校刚毕业那会儿.它是生命,他们的牛b时间,一直想做点什么来证明自己.具体地,并且现在是在最好的时候.互 ...
- 入门 ASP.NET Web API 2 (C#)
入门 ASP.NET Web API 2 (C#) HTTP 不只是为了生成 web 页面.它也是一个强大的建设公开服务和数据 Api的平台. HTTP 的特性:简单. 灵活和无处不在.你能想到的几乎 ...
- js urlencode , encodeURIComponent
js 对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent ...
- MVC 4
Asp.net MVC 4 学习笔记(一) 公司最新的产品改成MVC开发模式了,以前产品开发都是经典的三层架构.对于“听闻”过而不有实际“品偿”过MVC的程序员来说,是知识的狭隘的表现.于是乎最近在学 ...
- [置顶] 如何使用c3p0+spring连接oracle数据库
1. 首先是jdbc.properties属性文件的编写,便于数据库移植: datasource.driverClassName=oracle.jdbc.driver.OracleDriver dat ...
- TCP应用
.Net 并行计算 ----并行任务 本文作为 .Net 并行计算 的第二篇 名词解释 任务并行是指一个或者多个独立的任务同时运行.任务并行类似于多线程或者ThreadPool 工作项.但是抽象的级别 ...
- Moq 测试 属性,常用方法
RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...
- HttpClient 检索与获取过程数据
使用 HttpClient 检索与获取过程数据 对于System.Net.Http的学习(一)——System.Net.Http 简介 对于System.Net.Http的学习(二)——使用 Ht ...
- intellij idea 学习
intellij idea是一个java的ide.由jetbrain开发. intellij idea快捷键 快捷键 说明 备注 Ctrl+N 快速导航到类 类似于Resharper中的C ...
- EF POWER TOOLS由数据库逆向CODE FIRST
EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...