【算法每日一练]-图论(保姆级教程篇13 欧拉路径,回路)

news/2024/7/7 20:31:34

目录

 判断有向图有欧拉回路

 判断有向图有欧拉路径


        

如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。

(每个点都经过一次就是旅行商问题)

预备知识:

有向图有欧拉路径:

等价于:非0度节点连通,且所有节点入度等于出度(欧拉回路) 或 有n-2个节点入度等于出度,另外两个节点一个多1一个少1

        
无向图有欧拉路径:  

等价于:连通图,且没有度为奇数的节点(欧拉回路) 或 只有两个2个度为奇数的节点 

        

                

 判断有向图有欧拉回路

判断连通使用并查集(一个for即可) 入度等于出度(一个for即可)

#include <bits/stdc++.h>       
using namespace std;
const int N=1e5+7;
int fa[N],in[N],out[N],n,m;
int find(int x)
{
    if(x!=fa[x]) fa[x]=find(fa[x]);
    return fa[x];//返回祖先 
}
void unity(int x, int y)
{
    int f1=find(x);//如果x和y本来就在同一个集合完全 不影响
    int f2=find(y);
    fa[f1]=f2;//合并树根 
}
bool check(){
	int pre;
	for(int i=1;i<=n;i++){
		int du=in[i]+out[i];
		if(!du)continue;//度为0直接跳过
		if(i!=1&&find(i)!=find(pre))return 0;//前面的点是否和当前点在同一个集合
		pre=i;
	}
	return 1;
}
int main()
{
		cin>>n>>m;int x,y;
	    for(int i=1; i<=n; i++) fa[i]=i;
	    for(int i=1; i<=m; i++){
	    	scanf("%d %d", &x, &y);
	        in[y]++;out[x]++;
	        unity(x,y);//建树
		}
		if(!check()){//先判断非0度节点是否连通
			cout<<"No";return 0;
		}
		int f=0;
		for(int i=1;i<=n;i++){//再判断入度是否等于出度
			if(in[i]!=out[i]){f=1;break;}
		}
		if(f==1)cout<<"No";
		else cout<<"Yes";
}

参考样例
3 4
1 2
2 3
3 1
1 1
yes
4 8
1 2
1 3
1 4
2 3
2 3
3 2
3 4
4 3

No
 

        
 判断有向图有欧拉路径

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int fa[N],in[N],out[N],n,m;
int find(int x)
{
    if(x!=fa[x]) fa[x]=find(fa[x]);
    return fa[x];//返回祖先 
}
void unity(int x, int y)
{
    int f1=find(x);//如果x和y本来就在同一个集合完全 不影响
    int f2=find(y);
    fa[f1]=f2;//合并树根 
}
bool check(){
	int pre;
	for(int i=1;i<=n;i++){
		int du=in[i]+out[i];
		if(!du)continue;//度为0直接跳过
		if(i!=1&&find(i)!=find(pre))return 0;//前面的点是否和当前点在同一个集合
		pre=i;
	}
	return 1;
}
int main()
{
		cin>>n>>m;int x,y;
	    for(int i=1; i<=n; i++) fa[i]=i;
	    for(int i=1; i<=m; i++){
	    	scanf("%d %d", &x, &y);
	        in[y]++;out[x]++;
	        unity(x,y);//建树
		}
		if(!check()){//先判断非0度节点是否连通
			cout<<"No";return 0;
		}
		int f1=0,f2=0,f3=0;
		for(int i=1;i<=n;i++){
			if(in[i]==out[i])f1++;
			else if(in[i]-out[i]==1)f2++;
			else if(out[i]-in[i]==1)f3++;
		}
		if((f1==n)||(f1==n-2&&f2==1&&f3==1))cout<<"Yes";
		else cout<<"No";
}

参考样例
4 3 
1 2
2 3
3 4
YES
4 8
1 2
1 3
1 4
2 3
2 3
3 2
3 4
4 3

No
 


http://lihuaxi.xjx100.cn/news/1894841.html

相关文章

【C语言】C的面向对象

一、BREW接口实现 高通的BREW&#xff08;Binary Runtime Environment for Wireless&#xff09;是一个早期为手机设备开发的应用程序平台&#xff0c;用于开发在CDMA手机上运行的软件。尽管这个平台目前已经不太流行&#xff0c;但是在其使用高峰时期&#xff0c;开发者需要使…

typescript个人学习笔记

https://ts.xcatliu.com/basics/primitive-data-types.html 深受启发 1.剑谱第一页&#xff0c;初始化ts outDir表示把ts编译成js文件&#xff0c;文件编译后存放的位置 2.类型声明 基础数据五种 undefined可以赋值给其他类型引用类型数组对象 //定义数组一 let arr:[][]…

报错“找不到mfc100u.dll,程序无法继续执行”的解决方法,完美解决

在软件操作过程中&#xff0c;部分用户可能遇到"计算机缺失mfc140u.dll导致无法启动程序"的困扰。这种情况常常发生在启动某特定应用&#xff0c;特别是需要VC Redistributable支持的软件时。以下为详尽解决策略&#xff0c;让用户轻松应对这类技术难题&#xff0c;重…

数组笔试题解析(下)

数组面试题解析 字符数组 &#xff08;一&#xff09; 我们上一篇文章学习了一维数组的面试题解析内容和字符数组的部分内容&#xff0c;我们这篇文章讲解一下字符数组和指针剩余面试题的解析内容&#xff0c;那现在&#xff0c;我们开始吧。 我们继续看一组字符数组的面试…

geolife笔记:比较不同轨迹相似度方法

1 问题描述 在geolife 笔记&#xff1a;将所有轨迹放入一个DataFrame-CSDN博客中&#xff0c;已经将所有的轨迹放入一个DataFrame中了&#xff0c;我们现在需要比较&#xff0c;在不同的轨迹距离度量方法下&#xff0c;轨迹相似度的效果。 这里采用论文笔记&#xff1a;Deep R…

【Qt5】ui文件最后会变成头文件

2023年12月14日&#xff0c;周四下午 我也是今天下午偶然间发现这个的 在使用Qt的uic&#xff08;User Interface Compiler&#xff09;工具编译ui文件时&#xff0c;会生成对应的头文件。 在Qt中&#xff0c;ui文件是用于描述用户界面的XML文件&#xff0c;而头文件是用于在…

欧拉函数与欧拉定理

文章目录 AcWing 873. 欧拉函数题目链接欧拉函数欧拉函数的证明思路CODE时间复杂度分析 AcWing 874. 筛法求欧拉函数题目链接问题分析与时间复杂度CODE思路 欧拉定理 AcWing 873. 欧拉函数 题目链接 https://www.acwing.com/activity/content/problem/content/942/ 欧拉函数 …

SpringBoot之JSON参数,路径参数的详细解析

1.6 JSON参数 在学习前端技术时&#xff0c;我们有讲到过JSON&#xff0c;而在前后端进行交互时&#xff0c;如果是比较复杂的参数&#xff0c;前后端通过会使用JSON格式的数据进行传输。 &#xff08;JSON是开发中最常用的前后端数据交互方式&#xff09; 我们学习JSON格式参…