首页 > 其他分享 >欧拉道路与欧拉回路

欧拉道路与欧拉回路

时间:2023-09-07 20:45:19浏览次数:41  
标签:int long ++ 道路 dfs 回路 calc 欧拉

欧拉道路是指不重复的经过图的每一条边所形成的道路

欧拉回路是指不重复的经过图的每一条边所形成的回路

这类问题都可以使用dfs来求解

下面给出几道例题

1.P6066 [USACO05JAN] Watchcow S

解析:

一道模板题,建好双向边,走过一次删掉一条

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+39+7;
int n,m,vis[N];
struct node{
	int to,visit;
};
stack<int>st;
vector<node>G[N]; 
void dfs(int x){
	for(int i=vis[x];i<G[x].size();i=vis[x]){
		vis[x]=i+1;
		if(G[x][i].visit)continue;
		G[x][i].visit=1;
		dfs(G[x][i].to);
	}
	st.push(x);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;cin>>x>>y;
		G[x].push_back({y,0});
		G[y].push_back({x,0});
	}
	dfs(1);
	while(st.size()){
		cout<<st.top()<<'\n';
		st.pop();
	}
	return 0;
}

  

2.P7771 【模板】欧拉路径

解析:

模板题,判断有向图是否存在欧拉路径,只需要看度,如果存在入度和出度不等的,判断一下,分三种情况:1.入度-出度=1,cnt++ 2.出度-入度=1,cnt1++,并将起点设为当前点的编号  3.直接输出No

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+39+7;
vector<int>G[N];
stack<int>st;pair<int,int>cnt={0,0};
int n,m,vis[N],din[N],dout[N],is=1,s=1;
void dfs(int x){
	for(int i=vis[x];i<G[x].size();i=vis[x]){
		vis[x]=i+1;
		dfs(G[x][i]);
	}
	st.push(x);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;cin>>x>>y;
		G[x].push_back(y);
		din[y]++;dout[x]++;
	}
	for(int i=1;i<=n;i++)sort(G[i].begin(),G[i].end());
	for(int i=1;i<=n;i++){
		if(din[i]!=dout[i]){
			is=0;
			if(din[i]-dout[i]==1)cnt.first++;
			else if(dout[i]-din[i]==1){
				cnt.second++;
				s=i;
			}else{
				cout<<"No";
				return 0;
			}
		}
	}
	if((!is)&&!(cnt.first==cnt.second&&cnt.first==1)){
		cout<<"No";
		return 0;
	}
	dfs(s);
	while(st.size()){
		cout<<st.top()<<' ';
		st.pop();
	}
	return 0;
}

  

3.P1341 无序字母对

解析:
使用字母编号跑欧拉路径的模版即可,编号规则:A~Z为1~26,a~z为27~52

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+39+7;
int calc(char c){
	if(c<='z'&&c>='a')return c-'a'+27;
	else return c-'A'+1;
}
char uncalc(int n){
	if(n>=27&&n<=52)return n+'a'-27;
	else return n+'A'-1;
}
int n,m,vis[N],d[N],a[N][N];
stack<int>st;
void dfs(int x){
	for(int i=1;i<55;i++){
		if(!a[x][i])continue;
		a[x][i]=a[i][x]=0;
		dfs(i);
	}
	st.push(x);
}
int main(){
	cin>>n;
	int k=0x3f3f3f3f;
	for(int i=1;i<=n;i++){
		string s;cin>>s;
		a[calc(s[0])][calc(s[1])]=a[calc(s[1])][calc(s[0])]=1;
		++d[calc(s[0])];++d[calc(s[1])];
		k=min(k,min(calc(s[0]),calc(s[1])));
	}
	int cnt=0,t=0x3f3f3f3f;
	for(int i=1;i<=55&&cnt<=2;i++){
		if(d[i]%2){
			cnt++;
			t=min(t,i);
		}
	}
	if(cnt==1||cnt>2){
		cout<<"No Solution";
		return 0;
	}
	if(cnt==0)dfs(k);
	else dfs(t);
	while(st.size()){
		cout<<uncalc(st.top());
		st.pop();
	}
	return 0;
}

  

标签:int,long,++,道路,dfs,回路,calc,欧拉
From: https://www.cnblogs.com/zhanghx-blogs/p/17686008.html

相关文章

  • 基于VGG-Net网络的道路语义分割
    1.目的项目基于VGG-Net网络实现道路图像的语义分割,利用英特尔开发工具,验证经过英特尔开发工具优化后的训练时间与推理时间与未经优化前推理时间的差异。2.关键实施细节系统基于Tensorflow进行程序的开发,使用英特尔oneAPIAI分析工具套件分析与原始版本的区别。采用端到端的方式进行......
  • 线性筛素数(欧拉筛)
    题目描述求\(1,2,\cdots,N\)中素数的个数。输入格式一行一个整数\(N\)。输出格式一行一个整数,表示素数的个数。样例#1样例输入#110样例输出#14提示对于\(40\%\)的数据,\(1\leN\le10^6\)。对于\(80\%\)的数据,\(1\leN\le10^7\)。对于\(100\%\)的......
  • Lnton羚通智能分析算法道路病害识别监测系统,使用CNN网络深度学习算法
    道路病害识别监测系统通过CNN网络深度学习算法,道路病害识别监测对巡检车上实时监控道路影像数据进行分析,输出道路病害裂缝巡检报告并落图展示。卷积神经网络(ConvolutionalNeuralNetwork,CNN)在图像处理和图像识别任务中取得了很大的成功。它通过卷积层、池化层和全连接层的组......
  • 企业新道路怎么走?火山引擎AB测试助力决策选择
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群乐刻是一家创立8年的企业,除了消费者熟悉的乐刻健身房可办月卡、24小时营业等,其还有比外界了解更多元的业务。目前,乐刻已在24个城市开出超1200家门店,注册会员数突破800万人,拥有乐刻健身、FEELINGME......
  • 企业新道路怎么走?火山引擎AB测试助力决策选择
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 乐刻是一家创立8年的企业,除了消费者熟悉的乐刻健身房可办月卡、24小时营业等,其还有比外界了解更多元的业务。目前,乐刻已在24个城市开出超1200家门店,注册会员数突破800万人,拥有乐刻健......
  • AcWing 873. 欧拉函数
    题目给定$n$个正整数$a_i$,请你求出每个数的欧拉函数。欧拉函数的定义$1∼N$中与$N$互质的数的个数被称为欧拉函数,记为$\varphi(N)$。若在算数基本定理中,$N={p_1}^{a_1}{p_2}^{a_2}...{p_m}^{a_m}$,则:$\varphi(n)=m(1-1/p_1)(1-1/p_2)...(1-1/p_k)$输入格式第......
  • 欧拉定理学习笔记
    欧拉定理:若\(gcd(a,m)=1\),则\(a^{\varphi(m)}\equiv1\pmod{m}\)证明:令\(r_1,r_2,···,r_{\varphi(m)}\)为模m下的一个简化剩余系,则\(ar_1,ar_2,···,ar_{\varphi(m)}\)也为模m下的一个简化剩余系,令\(f=r_1*r_2*···*r_{\varphi(m)}\),则有:\(f\equivar_1*ar_2*···*ar_{......
  • 欧拉回路与欧拉通路
    欧拉回路与欧拉通路定义、性质及结论一些定义:回路:从一个点出发又回到这个点的路径。通路:从一个点出发到任意一个点结束的路径。有向图强联通:所有点两两可达有向图弱联通:把所有有向边变成无向后所有点都属于一个联通快欧拉回路:通过图中每条边恰好一次的回路。欧拉通路:通过......
  • 【转载】如何通俗地解释欧拉角?之后为何要引入四元数?
    转载自:https://www.zhihu.com/tardis/bd/ans/236284413?source_id=1001   为何要引入四元数?首先是因为欧拉角有万向节死锁的问题。3D游戏或者3D电影中,比如黑客帝国中酷炫的旋转是怎么实现的?旋转的算法有很多,这里主要介绍其中一种:欧拉角。1欧拉角1.1欧拉角的算法......
  • 旋转矩阵与欧拉角
    旋转矩阵与欧拉角参考文献:[ComputingEuleranglesfromarotationmatrix——GregoryG.Slabaugh]三个主轴的旋转矩阵右手坐标系,逆时针转动角度为正(右手螺旋定则确定)。关于绕\(x\)轴旋转\(\psi\)弧度的主动旋转定义为\[R_x(\psi)=\begin{bmatrix}......