首页 > 其他分享 >欧拉路径&&欧拉回路

欧拉路径&&欧拉回路

时间:2024-04-25 13:12:32浏览次数:28  
标签:head int 路径 edges && 回路 节点 欧拉

定义:

欧拉路径:指图中的一条路径,使得所有边都被经过且只经过一次

欧拉回路:指图中的一条欧拉路径,且起点和终点相同。

欧拉图:指有欧拉回路的图

半欧拉图:指有欧拉路径但没有欧拉回路的图

性质:

1.如果一个无向图是欧拉图,那么所有节点的度数均为偶数

2.如果一个无向图是半欧拉图,那么除了两个节点的度数为奇数,其他的节点度数都为偶数

3.如果一个有向图是欧拉图,那么对于每个节点,它的入度和出度相等。

4.如果一个有向图是半欧拉图,那么除了两个节点的入出度差为 \(1\) 以外,其他节点入出度差都为 \(0\)(即相等)。

HierHolzer:

problem:

给定图 \(G\),求 \(G\) 中字典序最小的欧拉路径

solution:

先考虑生成欧拉路径:

1.找到出度减入度为 \(1\) 的节点(假如没有默认为 1 号节点),将其作为起始节点进行 \(dfs\)。

2.考虑 \(u\) 节点未访问过的边 \((u,v)\),如果没有,将 \(u\) 节点压入栈并返回。

3.标记 \((u,v)\) 为已访问。

4.对 \(v\) 进行2,3操作。

5.所有操作完成后,将栈中元素输出。

通过这里我们知道,元素是倒序输出的,所以我们要让后面的元素尽量小,所以其实就是要将链式前向星中的元素从大到小排序。

代码:


#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int N=1e5+10;
struct edge{
	int v,next;
}edges[N*2];
int head[N],idx;
int n,m; 

void add_edge(int u,int v){
	idx++;
	edges[idx].v=v;
	edges[idx].next=head[u];
	head[u]=idx;
	return;
}

int stk[N*3],top;
void dfs(int u){
	for(int i=head[u];i;i=head[u]){
		int v=edges[i].v;
		head[u]=edges[i].next;
		dfs(v);
	} 
	stk[++top]=u;
	return;
}

int degin[N],degout[N];

struct stu{
	int u,v;
}st[N*2];
bool cmp(struct stu st1,struct stu st2){
	if(st1.u==st2.u)return st1.v>st2.v;
	return st1.u>st2.u;
}

signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>st[i].u>>st[i].v; 
	}
	sort(st+1,st+m+1,cmp);
	for(int i=1;i<=m;i++){
		add_edge(st[i].u,st[i].v);
		degin[st[i].v]++;
		degout[st[i].u]++;
	}
	int s=1,cnt=0;
	for(int i=1;i<=n;i++){
		if(abs(degin[i]-degout[i])&1)cnt++;
		if(degout[i]-degin[i]==1)s=i;
	}
	if(cnt!=2&&cnt!=0){
		cout<<"No"<<endl;
		return 0;
	}
	dfs(s);
	while(top>0){
		cout<<stk[top]<<" ";
		top--;
	}
	
	return 0;
}

标签:head,int,路径,edges,&&,回路,节点,欧拉
From: https://www.cnblogs.com/little-corn/p/18157440

相关文章

  • 欧拉系统-安装Docker
    欧拉系统-安装Docker[toc]零、资料https://lab.huaweicloud.com/experiment-detail_2417?ticket=ST-92642093-vahMts7MDOKnplPdCsCFfCrs-sso一、步骤wgethttps://download.docker.com/linux/static/stable/x86_64/docker-18.09.9.tgztarzxfdocker-18.09.9.tgzmvd......
  • Oracle+RAC静默安装系列(基于RHEL9/国产/麒麟/华为欧拉的生产案例)
    由风哥发布的 Oracle+RAC静默安装系列(基于RHEL9/国产/麒麟/华为欧拉的生产案例)系列,适合运维人员/数据库/开发人员,可以用于业务生产环境。为满足想快速安装布署Oracle数据库的学员,风哥特别设计的一套比较全面的全命令行静默安装配置数据库课程,本系列共7套课程,内容如下:1)全......
  • 三十 3999. 最大公约数 (欧拉函数)
    3999.最大公约数(欧拉函数)importjava.util.*;publicclassMain{privatestaticintT;privatestaticlonga,m;privatestaticlonggcd(longa,longb){returnb==0?a:gcd(b,a%b);}privatestaticlonge......
  • P7771 【模板】欧拉路径
    原题链接题解链式前向星版本的欧拉回路dfsvoiddfs(intu){for(inti=head[u];i>0;i=head[u]){head[u]=Next[i];//走过的路直接跳过dfs(to[i]);}que[l++]=u;}接下来的难点是如何字典序搜索。我们在dfs的时候直接让走字典序最小的边即......
  • 欧拉函数
    一、性质求欧拉函数fromcollectionsimportCounter#证明:容斥原理#f(N)=N*(1-1/p1)*(1-1/p2)*...*(1-1/pn)#与N互质的数的个数:N-N/P1-N/P2-...-N/Pn+N/(p1p2)+...+...-...defcal_euler(x):ans=xcnt=Counter()i=......
  • 万向锁与欧拉角
    万向锁与欧拉角附赠自动驾驶学习资料和量产经验:链接前言上一篇中我们讲了欧拉角与旋转变化,最后留了一个悬念,就是欧拉角在俯仰角为±90°时会出现万向锁现象,这是欧拉角表征飞行器姿态的一个局限性,今天我们就来谈谈这个局限性是怎么产生的,以及如何解决这个问题。陀螺仪为了能......
  • 欧拉降幂
    什么是欧拉降幂欧拉函数(Euler'sTotientFunction)是指小于等于n的正整数中与n互质的数的个数,通常用符号φ(n)表示。对于一个正整数n,φ(n)表示满足条件的数的个数。当计算\(a^b\modn\)时,如果\(a\)和\(n\)互质(即它们的最大公约数为1),那么我们可以利用欧拉函数的性质来简化计算。......
  • 一类哈密顿路径/回路为背景的状压dp
    https://codeforces.com/contest/1950/problem/G在非连通图上找到一条包含点最多的路径,dp数组维护可达性//Problem:G.ShufflingSongs//Contest:Codeforces-CodeforcesRound937(Div.4)//URL:https://codeforces.com/contest/1950/problem/G//MemoryLimit:256......
  • VMware创建openEuler OS(欧拉)系统镜像虚拟机
    首先下载openEuler镜像文件,这里附上我使用的镜像版本链接:https://pan.baidu.com/s/1bCW7CGq05wGTM3VG_wks7A?pwd=ux5f 提取码:ux5f此处附上欧拉各版本网站openEuler下载|欧拉系统ISO镜像|openEuler社区官网下面开始安装步骤:蓝色框框内的选项自定义此处就创建好啦......
  • 欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理
     数据结构、算法总述:数据结构/算法C/C++-CSDN博客欧拉函数欧拉函数(Euler'stotientfunction)是一个与正整数n相关的数论函数,通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数intphi(intx){intres=x;for(inti=2;i<=x/i;i++)......