写了一道欧拉回路的模板题。先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在。

之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会写成m^2的复杂度

附上代码——by VANE

 #include<bits/stdc++.h>
using namespace std;
int t,n,m;
const int N=;
int l,last[N],pre[N<<],other[N<<],f[N];
int rd[N],cd[N];
int getfa(int x)
{
return x==f[x]?x:f[x]=getfa(f[x]);
}
bool not_lone[N];
bool vis[N<<];
void add(int a,int b,int c)
{
if(c==)
{++l;pre[l]=last[a];last[a]=l;other[l]=b;}
else
{int L=l+m;pre[L]=last[a];last[a]=L;other[L]=b;}
}
void merge(int x,int y)
{
int fx=getfa(x),fy=getfa(y);
if(fx!=fy)
f[fx]=fy;
}
int abs(int x)
{
return x<=m?x:x-m;
}
int val(int x)
{
return x<=m?x:m-x;
}
stack<int> sk;
void dfs(int x)
{
for(int p=last[x];p;p=last[x])
{
while(vis[abs(p)]&&p) p=pre[p];
last[x]=p;
if(p)
{
vis[abs(p)]=;
dfs(other[p]);
sk.push(val(p));
}
} }
int main()
{
scanf("%d%d%d",&t,&n,&m);
for(int i=;i<=n;++i) f[i]=i;
for(int i=;i<=m;++i)
{
int x,y;scanf("%d%d",&x,&y);
add(x,y,);if(t==) add(y,x,m);
cd[x]++;rd[y]++;
not_lone[x]=not_lone[y]=;
merge(x,y);
}
int rt=;
for(int i=;i<=n;++i)
{
if(not_lone[i])
{
rt=i;break;
}
}
for(int i=;i<=n;++i)
if(not_lone[i]&&getfa(i)!=getfa(rt))
{
puts("NO");
return ;
}
if(t==)
{
for(int i=;i<=n;++i)
if((rd[i]+cd[i])&)
{puts("NO");return ;}
}
else
{
for(int i=;i<=n;++i)
if(rd[i]!=cd[i])
{puts("NO");return ;}
}
for(int i=;i<=n;++i)
if(not_lone[i])
{
dfs(i);
break;
}
puts("YES");
while(!sk.empty())
{
printf("%d ",sk.top());
sk.pop();
}
}

下面的By:大奕哥

我们就直接搜索啦,对于无向图需要保证的性质是任何点的出度+入度都要为偶数,对于有向图任意点的出度都要等于入度。

搜索就是一个回溯的过程,然后每次我们都把边删掉(head[x]=i)

然后如果要是能搜的话我们就加入队列。

在这里要特别注意对于孤立点(无任何边连入无任何边连出)的点,搜索从任意一个连边的点即可。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,top,cnt,f[N],head[N],d1[N],d2[N],q[N];
struct node
{
int to,nex,w;
}e[N<<];
void add(int x,int y,int w)
{
e[++cnt].to=y;e[cnt].nex=head[x];
head[x]=cnt;e[cnt].w=w;
d1[x]++;d2[y]++;
}
void dfs(int x)
{
for(int i=head[x];i;i=head[x])
{
while(i&&f[abs(e[i].w)])i=e[i].nex;
head[x]=i;
if(i)
{
f[abs(e[i].w)]=;
dfs(e[i].to);
q[++top]=e[i].w;
}
}
}
int main()
{
int n,m,x,y,p,k;
scanf("%d%d%d",&p,&n,&m);
for(int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
add(x,y,i);
if(p==)add(y,x,-i);
}
for(int i=;i<=n;++i)if(p==&&d1[i]%||p==&&d1[i]!=d2[i]){puts("NO");return ;}
dfs(x);
if(top<m){puts("NO");return ;}
puts("YES");
for(int i=top;i;--i)printf("%d ",q[i]);
return ;
}

欧拉回路 uoj117的更多相关文章

  1. 算法复习——欧拉回路(uoj117)

    题目: 题解: 欧拉回路相关定理(相关定义和证明请参见其他资料): 1.欧拉回路 (1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件. (2)无向图:所有点的度都为偶数为该图 ...

  2. 求欧拉回路 UOJ117

    传送门什么是欧拉回路呢……?欧拉回路的定义就是从vi出发到vi,经过每条边有且只有一次的路径. 就很像一笔画. 欧拉回路的性质较多……定理也很多……直接证明很长……我们还是直接说怎么判定,怎么求欧拉回 ...

  3. UOJ117. 欧拉回路【欧拉回路模板题】

    LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...

  4. uoj117 欧拉回路

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

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

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

  6. UOJ117 欧拉回路[欧拉回路]

    找欧拉回路的模板题. 知识点详见图连通性学习笔记. 注意一些写法上的问题. line37&line61:因为引用,所以j和head值是同步更新的,类似于网络流的当前弧优化,除了优化枚举外,这样 ...

  7. 【UOJ117】 欧拉回路(欧拉回路)

    传送门 UOJ Solution 无解 t=1,无向图,当且仅当\(\exists i \ \ in_i \ne out_i\) t=2,有向图,当且仅当\(\exists i \ \ in_i是奇数 ...

  8. ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

    //网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...

  9. [poj2337]求字典序最小欧拉回路

    注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...

随机推荐

  1. 使用CSS3+JQuery打造自定义视频播放器

    简介 HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发 ...

  2. 【BZOJ】4596: [Shoi2016]黑暗前的幻想乡

    [题意]给定n个点的无向完全图,有n-1个公司各自分管一部分路,要求所有公司都有修路的生成树数.n<=17. [算法]容斥原理+生成树计数(矩阵树定理) [题解]每个生成树方案是一个公司有无修路 ...

  3. HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)

    题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  4. 常用的css3新特性总结

    1:CSS3阴影 box-shadow的使用和技巧总结: 基本语法是{box-shadow:[inset] x-offset y-offset blur-radius spread-radiuscol ...

  5. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

  6. var_dump打印出来格式太乱 怎么调

    var_dump()和print_r() 输出的都是文本格式,在浏览器中就是这样如果你加载了 xdebug 扩展,那么 var_dump() 就会以 html 格式输出

  7. 使用SPLUNK进行简单Threat Hunting

    通过订阅网上公开的恶意ip库(威胁情报),与SIEM平台中网络流量日志进行匹配,获得安全事件告警. 比如,这里有一个malware urls数据下载的网站,每天更新一次: https://urlhau ...

  8. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  9. 摘: 给Shapre命名

    有两种解决方式: 在 VBA 中将slide中的Shape命名,改变shape.name即可. 另外一种方式就是有点投机取巧:你可以点击shap,右键选择web/alternativetext做些标记 ...

  10. 日志生成控制文件syslog.conf

    1: syslog.conf的介绍 对于不同类型的Unix,标准UnixLog系统的设置,实际上除了一些关键词的不同,系统的syslog.conf格式是相同的.syslog采用可配置的.统一的系统登记 ...