【UOJ 117】欧拉回路
#117. 欧拉回路
有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
一共两个子任务:
- 这张图是无向图。(50分)
输入格式
第一行一个整数 t,表示子任务编号。t∈{1,2},如果 t=1则表示处理无向图的情况,如果 t=2 则表示处理有向图的情况。
第二行两个整数 n,m,表示图的结点数和边数。
接下来 m 行中,第 i 行两个整数 vi,ui,表示第 ii 条边(从 11 开始编号)。保证 1≤vi,ui≤n
- 如果 t=1
- 则表示 vi 到 ui 有一条无向边。
- 如果 t=2
- 则表示 vi 到 ui 有一条有向边。
图中可能有重边也可能有自环。
输出格式
如果不可以一笔画,输出一行 “NO”。
否则,输出一行 “YES”,接下来一行输出一组方案。
如果 t=1,输出 m个整数 p1,p2,…,pm。令 e=∣pi∣,那么 e 表示经过的第 i 条边的编号。如果 pi 为正数表示从 ve 走到 ue,否则表示从 ue 走到 ve。
如果 t=2,输出 m 个整数 p1,p2,…,pm。其中 pi 表示经过的第 i条边的编号。
样例一
input
1
3 3
1 2
2 3
1 3output
YES
1 2 -3样例二
input
2
5 6
2 3
2 5
3 4
1 2
4 2
5 1output
YES
4 1 3 5 2 6限制与约定
1≤n≤10^5,0≤m≤2×10^5
时间限制:1s
空间限制:256MB
【分析】
这是欧拉回路的模板题。
主要是这样:
无向图:所有点的度数都为偶数,一定有欧拉回路,从任意一个点开始都可以。
有向图:所有点的入度=出度,一定有欧拉回路,从任意一个点开始都可以。
我们不断走边,边没打过标记的就走,经过一条边就打标记,表示不能走这条边了,然后回溯的时候把路径记录下来,反着输出就可以。
走过的边不仅要打标记(主要是无向图的反向边要标记一下),还要删除,不然即使不再走这条边也会不断询问它而导致TLE,
解决方法是改变边目录的first数组,表示前面访问过的边都不用再继续访问了。
void ffind(int x)
{
vis[x]=1;
for(int i=first[x];i;i=first[x]) if(t[i].p)
{
int y=t[i].y;
t[i].p=t[t[i].o].p=0;
first[x]=t[i].next;
ffind(y);
op[++op[0]]=t[i].id;
}
else first[x]=t[i].next;
}
核心代码如上。
【GDXB当初告诉我这叫套圈算法?
【主要是回溯那里还有删边那里要记得。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
#define Maxm 200010
#define Maxn 100010 struct node
{
int x,y,c,next,o;
int id;
bool p;
}t[*Maxm];
int first[Maxn],len;
int T; void ins(int x,int y,int id)
{
t[++len].x=x;t[len].y=y;t[len].p=;
t[len].id=id;t[len].next=first[x];first[x]=len;
if(T==) t[len].o=len&?len+:len-;
else t[len].o=len;
} int rd[Maxn],cd[Maxn],op[Maxm];
bool nw=,vis[Maxn]; void ffind(int x)
{
vis[x]=;
for(int i=first[x];i;i=first[x]) if(t[i].p)
{
int y=t[i].y;
t[i].p=t[t[i].o].p=;
first[x]=t[i].next;
ffind(y);
op[++op[]]=t[i].id;
}
else first[x]=t[i].next;
} int main()
{
scanf("%d",&T);
int n,m;
scanf("%d%d",&n,&m);
len=;
memset(first,,sizeof(first));
memset(rd,,sizeof(rd));
memset(cd,,sizeof(cd));
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
rd[y]++;cd[x]++;
ins(x,y,i);
if(T==) ins(y,x,-i);
}
bool ok=;
for(int i=;i<=n;i++) if(T==&&(rd[i]+cd[i])%!=) {ok=;break;}
for(int i=;i<=n;i++) if(T==&&rd[i]!=cd[i]) {ok=;break;}
op[]=;
if(!ok) printf("NO\n");
else
{
for(int i=;i<=n;i++) vis[i]=;
for(int i=;i<=n;i++)
{
ffind(i);
if(op[]!=) break;
}
if(T==&&op[]!=len/) printf("NO\n");
else if(T==&&op[]!=len) printf("NO\n");
else
{
printf("YES\n");
for(int i=op[];i>=;i--)
{
printf("%d ",op[i]);
}
printf("\n");
} }
return ;
}
2017-03-02 21:09:04
【UOJ 117】欧拉回路的更多相关文章
- UOJ#117. 欧拉回路
#117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...
- 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)
原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...
- UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...
- 「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无解,然 ...
随机推荐
- JSP和Servlet面试题
1.讲下servlet的执行流程. Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()<启动顺序根据web.xml里的startup-o ...
- 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)
题目链接 \(g[i][j]\)表示不走在\(i\text{~}j\)时间段中会关闭的港口(哪怕只关\(1\)天)从\(1\)到\(m\)的最短路. \(f[i]\)表示前\(i\)天的最小花费.于是 ...
- [转载]PM管理技巧
产品经理的沟通策略 2016年10月11日/分类: 文章 /编辑: Amy 产品经理处于沟通枢纽的位置,工作中需要跟各种岗位的人打交道,比如:领导.开发.运营.客户.用户.合作伙伴… 沟通能力是产 ...
- spring-boot-资源处理
WebMvcConfigurerAdapter 使用 1.实现 HandlerInterceptorAdapter 2.添加拦截器 重写WebMvcConfigurerAdapter中的addInte ...
- 深入理解Spring系列之二:BeanDefinition解析
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483814&idx=1&sn=ddf49931d55 ...
- 【Tomcat】tomcat中server.xml配置详解
Tomcat Server的结构图如下: 该文件描述了如何启动Tomcat Server <Server> <Listener /> <GlobaNaming ...
- Linux Kernel代码艺术——数组初始化【转】
转自:http://www.cnblogs.com/hazir/p/array_initialization.html 前几天看内核中系统调用代码,在系统调用向量表初始化中,有下面这段代码写的让我有点 ...
- elk系列1之入门安装与基本操作【转】
preface 我们每天都要查看服务器的日志,一方面是为了开发的同事翻找日志,另一方面是巡检服务器查看日志,而随着服务器数量以及越来越多的业务上线,日志越来越多,人肉运维相当痛苦了,此时,参考现在非常 ...
- sicily 1017. Rate of Return
Description Jill has been investing in a mutual fund for a while. Since her income has varied, the a ...
- 【BubbleCup X】D. Exploration plan
这个题首先一眼能看出二分答案…… 毕竟连可爱的边界都给你了. 下面就是怎么check 首先预处理跑一遍floyed,预处理出最短路. 用网络流判断能否达到即可. #include<bits/st ...