hiho一下 第五十周 (求欧拉路径)
http://hihocoder.com/contest/hiho50/problem/1
这题有重边,所以邻接矩阵用来统计节点u,v之间有多少条边相连,并且用另外一个数组统计每个节点的入度.
然后查找一个入度为奇数的点进行dfs(如果不存在就从n开始),
dfs的时候每次经过一条边就把这条边删除,因为一条边不会经过两次。
递归的时候保存路径.
总结起来:求解欧拉回路的方法就是,使用dfs,如果某条边被搜索到,则删除这条边,每次dfs结束之后,看当前节点还有没有与之相连的边,有就继续dfs下去.
最后,记录的回溯路径就是欧拉回路.
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int p[],in[];
int n,m,j;
int g[][];
void dfs(int x)
{
//printf("%d\n",x);
for(int i=;i<=n;i++)
{
if(g[x][i])
{
//printf("%d\n",g[x][i]);
int u=g[x][i];
g[x][i]--;
g[i][x]--;
dfs(i); //
}
}
p[j++]=x;
}
int main()
{
//freopen("a.txt","r",stdin);
int a,b,k;
while(~scanf("%d%d",&n,&m))
{
memset(g,,sizeof(g));
memset(in,,sizeof(in));
for(int i=;i<m;i++)
{
scanf("%d%d",&a,&b);
in[a]++;
in[b]++;
g[a][b]++;
g[b][a]++;
}
memset(p,,sizeof(p));
j=;
for(int i=;i<=n;i++)
if(in[i]&)
{
k=i;
break;
}
// printf("%d\n",j);
if(k<=n) dfs(k);
else dfs(n);
for(int i=;i<j-;i++)
printf("%d ",p[i]);
printf("%d\n",p[j-]);
}
return ;
}
从别人看到了输入挂:
#include <cstdio>
int g[][]={},path[]={},N,M,u,v,i,pathsize=,start,deg[]={};
char ch;
void read(int &aa)
{
aa=;
while(ch=getchar(),(ch<''||ch>'')&&(ch!='-'));
while(ch>=''&&ch<='') {aa=(aa<<)+(aa<<)+ch-'';ch=getchar();}
}
void dfs(int b)
{
for(int i=;i<=N;++i) {
if(i!=b&&g[b][i]) {
--g[b][i],--g[i][b];
dfs(i);
}
}
++pathsize;
path[pathsize]=b;
}
int main()
{
read(N),read(M);
for(;M--;) {
read(u),read(v);
++g[u][v],++g[v][u];
++deg[u],++deg[v];
}
for(start=;start<=N;++start)
if(deg[start]&)
break;
if(start<=N)
dfs(start);
else
dfs(N);
for(i=;path[i];++i) printf("%d ",path[i]);
}
hiho一下 第五十周 (求欧拉路径)的更多相关文章
- hiho一下 第五十一周(有向图欧拉路径)51
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- [hihoCoder] 第五十周: 欧拉路·二
题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角 ...
- hiho欧拉路·二 --------- Fleury算法求欧拉路径
hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇 ...
- 20155310 2016-2017-2 《Java程序设计》第十周学习总结
20155310 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 •网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就 ...
- 20155321 2016-2017-2 《Java程序设计》第十周学习总结
20155321 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 局域网和广域网:局域网通常限定在一个有效的地理区域之内,广域网由许多局域网组成.最 ...
- 20145213《Java程序设计》第十周学习总结
20145213<Java程序设计>第十周学习总结 教材学习总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接 ...
- 21045308刘昊阳 《Java程序设计》第十周学习总结
21045308刘昊阳 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴:程序员所作的事情 ...
- 20145236 《Java程序设计》 第十周学习总结
20145236 <Java程序设计> 第十周学习总结 Java网络编程 Java网络编程技术 Java语言是在网络环境下诞生的,所以Java语言虽然不能说是对于网络编程的支持最好的语言, ...
- 201521123072《java程序设计》第十周学习总结
201521123072<java程序设计>第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异 ...
随机推荐
- [转]Php MySql Class
本文转自:http://www.cnblogs.com/noevil/archive/2010/11/06/1870864.html <?php /** * 数据库操作类 * * @aut ...
- bootstrap框架栅格系统使用
使用的前端框架 bootstrap框架 Bootstrap是一个响应式的框架 我们在使用的时候主要使用的是它的网格系统, 1.bootstrap布局 布局容器:.container(用于固定宽度并支 ...
- 自学 iOS - 三十天三十个 Swift 项目 第三天
做了这个小demo 之后 感觉OC 和swift 还是有很大的差别的 自己还是要去多看些swift的语法 用的不是很熟练 1.这个demo 的资源文件 我都是用原工程的 2.同样的自定义cell 的 ...
- 怪物猎人OL简单测评与碎碎念
请移步我的个人网站查看: www.wuduojia.cn
- Request.Form("id")与Request.QueryString("id")的区别
获取以表单提交的post类型的值,也就是获取<form method="post">这种方式提交的值request包含各种方式的值,没有指名是什麽,所以Request. ...
- js模块化方案以及前端打包工具
图片来自知乎
- COPY - 在表和文件之间拷贝数据
SYNOPSIS COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ O ...
- vue之loader处理静态资源
webpack 是利用loader 来处理各种资源的,wepback的配置基本上就是为各种资源文件,指定不同类型的loader. 1,处理css 最基本的css 处理loader 是css-loade ...
- 06C#类
C#类 1.2 类的继承 在1.3节,定义了一个描述个人情况的类Person,如果我们需要定义一个雇员类,当然可以从头开始定义雇员类Employee.但这样不能利用Person类中已定义的函 ...
- 散列的键值对没初始化时不要用print打印此值,不要用 . 操作符去连接打印 这个值。
31 delete $vertical_alignment{$anonymous}; 32 print $vertical_alignment{$anonymous}."\n&quo ...