SGU101 求有重边的无向图欧拉迹
先判定是否为欧拉图,俩个条件,不说了。如果是欧拉图,输出路经。
方法:dfs遍历边,回溯时候记录边,遍历过了就标记“双向边”.
那么所记录的恰好是一条逆欧拉迹。不可以前进的时候标记,原因:有可能一笔画失败,导致边不连续,
而回溯的时候记录,原因较复杂,大致证明如下:
分几种情况讨论即可:
1,只有偶数结点。任选一个点,必然从一条出发回到该点,直到无边为止,回溯时边自然连续。
2,有2个奇数结点。当回到某个点时无论圈有没走,必然也连续,见图:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;int nume=0;
int e[205][2];int head[10];
void adde(int f,int l)
{e[nume][0]=l;e[nume][1]=head[f];head[f]=nume++;e[nume][0]=f;e[nume][1]=head[l];head[l]=nume++;
}
int degree[8]; //度数
int vis[205]; //标记访问
void dfs1(int u) //判断连通
{ for(int i=head[u];i!=-1;i=e[i][1]){int v=e[i][0];if(!vis[v]){vis[v]=1;dfs1(v);}}
}
int ans[205][2];int ansnum=0;
void dfs2(int u) //求欧拉迹
{for(int i=head[u];i!=-1;i=e[i][1]){if(!vis[i]){vis[i]=1; //此处同时标记双向边!!!。vis[i^1]=1;int v=e[i][0];dfs2(v); //回溯的时候记录边,恰是一条欧拉路。if(i%2==0)ans[ansnum++][0]=i/2+1;elseans[ansnum++][1]=i/2+1;}}
}
int main()
{scanf("%d",&n);for(int i=0;i<8;i++)head[i]=-1;int tf,tl;int tbegin=0;for(int i=0;i<n;i++) {scanf("%d%d",&tf,&tl);tbegin=tf;degree[tf]++;degree[tl]++;adde(tf,tl);}int count=0;int jis=0;;for(int i=0;i<=6;i++) //度数判定{if(degree[i]%2){count++;jis=i;}}if(count==0||count==2){int mark=1;vis[tbegin]=1;dfs1(tbegin); for(int i=0;i<=6;i++) //连通性判定if(vis[i]==0&°ree[i]>0)mark=0;if(mark==0){ printf("No solution\n");return 0;}for(int i=0;i<205;i++)vis[i]=0;if(count==0) dfs2(tbegin);elsedfs2(jis);for(int i=ansnum-1;i>=0;i--) //逆序输出{if(ans[i][0]!=0)printf("%d +\n",ans[i][0]);elseprintf("%d -\n",ans[i][1]);}}elseprintf("No solution\n");}
转载于:https://www.cnblogs.com/yezekun/p/3925729.html
SGU101 求有重边的无向图欧拉迹相关推荐
- POJ--1300--Door Man【推断无向图欧拉通路】
链接:http://poj.org/problem?id=1300 题意:有n个房间.每一个房间有若干个门和别的房间相连.管家从m房间開始走.要回到自己的住处(0),问是否有一条路能够走遍全部的门而且 ...
- 【模板题】欧拉函数与线性筛求欧拉函数
欧拉函数是什么? 定义:对于正整数nnn,欧拉函数是小于或等于nnn的正整数中与nnn互质的数的个数,记作φ(n)\varphi (n)φ(n). φ(1)=1\varphi (1)=1φ(1)=1. ...
- 欧拉函数/欧拉函数打表 lightoj1370(java/c++ )
例题 欧拉函数/素数判定 题目链接 题目 Bamboo Pole-vault是Xzhiland的一项大受欢迎的运动. Phi-shoe大师是他成功的非常受欢迎的教练.他需要为他的学生提供一些竹子,所以 ...
- Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数
传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,你需要实现两种操作: (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai都乘rrr. (2)(2)(2) 求ϕ(∏i= ...
- 数论 —— 欧拉函数
[定义] 对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作: 例如:,因为 1.3.5.7 均与 8 互质. [性质] 1)若 n 为一素数 p,则: 2)若 n 为一素数 p ...
- 欧拉函数φ(x)相关性质及计算
定义: 对 正整数nnn,欧拉函数是 小于nnn的正整数 中 与nnn互质的数的数目.(φ(1)=1\varphi(1)=1φ(1)=1) 互质:aaa与bbb互质,即gcd(a,b)=1\gcd( ...
- 数学知识——欧拉函数
1. 欧拉函数 定义:欧拉函数ψ(n) 表示1~n中与n互质的数的个数 公式:如果一个数可以被分解质因式为N = p1α1 *p2α2--pkαk 则ψ(n) = n(1 - 1/p1)(1 - 1/ ...
- 欧拉函数定义及其性质
参考:这里 前言 这是笔者第一次写博客,挑选了一些笔者认为比较有意思且简单的欧拉函数的性质,希望各位看完的同时也自己动手证明一下,会对学习欧拉函数有很大的帮助. 一.定义 在1~n中与n互质的数的个数 ...
- 欧拉如何解决哥尼斯堡七桥问题(二)
上一讲欧拉已经证明哥尼斯堡七桥问题不存在每座桥只走一次的走法.但是这里有一个特殊情况,即A.B.C.D每个地区恰巧都有奇数个桥连通.欧拉当然也想到了如果存在偶数桥,及任意数量的河和桥图是否存在每座桥只 ...
最新文章
- 【vue-router②】使用导航守卫控制页面前进刷新,后退缓存
- Java中JDK,JRE和JVM之间的关系
- 通过连接实例解读TCP/IP协议
- 第4章 DHCP服务
- tvnewpro 病毒清除
- 科大讯飞回应同传造假:人机耦合才是未来发展之道
- hdfs java读写hdfs demo
- Java技术——你真的了解String类的intern()方法吗
- 学习bind源代码,比较bind的方式绑定函数在在内存使用上优于箭头函数
- springboot缓存注解——@Cacheable和@CacheConfig
- 【Web学习笔记】easyui框架
- android mvp快速创建,学习MVPArms历程之Android Studio快速创建ArmsComponent组件化项目
- 什么是电脑pe系统?
- 图片裁剪工具vue-img-cutter
- AI玩Flappy Bird│基于DQN的机器学习实例【完结】
- 读入一句话(一行文本),统计26个大写字母各自出现的次数。(java)
- 立交匝道中边桩坐标放样正反算程序RAMP
- Android 源代码在线查看 目录结构 不完全指南
- 微信中html5获取手机号,微信小程序用户授权获取手机号(getPhoneNumber)
- Mahony算法 AHRS系统