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无解,然 ...
随机推荐
- sql2005还原超长sql脚本,还原超大脚本文件
原文:sql2005还原超长sql脚本,还原超大脚本文件 从外网把数据库用导出脚本的方式导出来了,280M的样子,导是导出来了,但是在本机执行sql脚本的时候,直接就是out of memory,之前 ...
- 几乎没用到过的css 样式
1. :focus 选择器用于选取获得焦点的元素. 案例:http://www.w3school.com.cn/tiy/t.asp?f=css_sel_focus 2. clearfix清除浮动闭合 ...
- innerText与innerHTML的区别
innerText与innerHTML的区别:1.innerText将所有文本内容作为普通的文本2.innerHTML会识别文本内容中是否含有html标签,它能够把html标签的效果显示出来3.inn ...
- c#编写的基于Socket的异步通信系统
c#编写的基于Socket的异步通信系统 SanNiuSignal是一个基于异步socket的完全免费DLL:它里面封装了Client,Server以及UDP:有了这个DLL:用户不用去关心心跳:粘包 ...
- Manager(管理器)
Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...
- Django是Python下的一款网络服务器框架
被解放的姜戈01 初试天涯 Django是Python下的一款网络服务器框架.Python下有许多款不同的框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django ...
- SugarSync的API总结
SugarSync API App支持SugarSync网盘的前提: 1.AccessKeyID:xxx 2.Private Access Key:xxx 3.AppID:xxx 详细的API总结如下 ...
- Python远程视频监控
Python远程视频监控程序 老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...
- web前端安全---读书笔记
web前端安全---读书笔记 粗略的看完了Web前端黑客技术揭秘前两章了,由于自身的前端功力不深,当然也是初涉前端的安全问题,所以实话还是有些问题看不太明白的.在豆瓣看到的这本书,名字真心有点很肥主流 ...
- 开发win8 metro monogame,显示pubcenter广告时会使游戏卡住的问题的解决方法。
开发win8 metro游戏,使用monogame,并且还加上pubcenter广告,但是在x64的机子上遇到了问题,广告一出,游戏卡死.经过一系列的判断,发现monogame一直在update和dr ...