欧拉路径!

news2025/2/27 3:01:06

呃在昨晚的破防之下我并不想学这东西所以留到今晚?属于是懒爆了。那么我们来看,定义的话其实前面写过了在这里插入图片描述
其实主要是分两个方面:
1.图是否联通,是什么图
2.这个图每个点的度数或者(出度入度)什么的若是符合就行。
偷偷总结一下:(在符合条件1的情况下)
如果是回路,那么有每个点的度数 出=入 或者 度数为偶数,那么如果不是回路那么在有向图中相当于多插入一个节点进去,那么其出度肯定比入度多1,那要是无向的话相当于你删除一条边,所以就有两个点的度数为奇数。
行P7771 【模板】欧拉路径

#include<bits/stdc++.h>
using namespace std;
int n,m,len=0,last[2000001];
int in[2000001],out[2000001],q[2000001],tot=0;
struct pp
{
	int x,y,next;
};pp p[2000001],L[2000001];
bool v[2000001];
bool cmp(const pp &x,const pp &y)
{
	if(x.x!=y.x) return x.x<y.x;
	return x.y>y.y;
}
void ins(int x,int y)
{
	int now=++len;
	p[now]={x,y,last[x]};last[x]=now;
	return ;
} 
void dfs(int x)
{
	for(int i=last[x];i!=-1;i=last[x])
	{
		last[x]=p[i].next;
		int y=p[i].y;dfs(y);
	}
	q[++tot]=x;
	return ;
}
int main()
{
	memset(last,-1,sizeof(last));memset(v,false,sizeof(v));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;scanf("%d%d",&x,&y);
		L[i].x=x,L[i].y=y;in[y]++,out[x]++;
	}
	bool pd=false;int sumin=0,sumout=0,ST=1;
	for(int i=1;i<=n;i++)
	{
		if(in[i]!=out[i]) pd=true;
		if(out[i]-in[i]==1) sumout++,ST=i;
		if(in[i]-out[i]==1) sumin++;
	}
	if(pd&&!(sumin==1&&sumout==1)) //如果不是欧拉回路,也不是欧拉路径 
	{
		printf("No");
		return 0;
	}
	sort(L+1,L+m+1,cmp);
	for(int i=1;i<=m;i++) ins(L[i].x,L[i].y);
	dfs(ST);
	for(int i=1;i<=tot;i++) printf("%d ",q[i]);
//	while(tot) printf("%d ",q[tot--]);
	return 0;
}

欸有好学的同学就要问啦,问什么要先走完所有循环再压入栈呢,就不能直接压入嘛,那么手推一组 1 -> 2 , 1 -> 3 , 3 ->1,那么你要是直接压入的话就会导致二的错误,那么解决方案就是用栈反着存,因为中间可能会绕很多环,而第一次遍历时无法保证那个环遍历了没,但你反着存的话就可以保证将环全部先走完。若先走的不是环也没有问题,因为你可以在后面遍历那些环然后将他们塞进去,但是通过手模你发现如果先进去的不是环的话那么其实会被直接压入栈中,若是环的话会一直走下去。
给出例题( > , < ),P1341 无序字母对好这一题是无向图我学会了些,最终处理的有点麻烦而已,只不过判断联通与否有些麻烦而已了,那么小细节无向图找点你学会了嘛?

for(int i=0;i<=n;i++)
	{
		if(du[i]%2) 
		{
			cnt++;
			if(ST==-1) ST=i;
		}
	}
	if(cnt&&cnt!=2) 
	{
		printf("No Solution");
		return 0;
	}
	if(ST==-1)
	{
		for(int i=0;i<=n;i++) 
		{
			if(du[i]) 
			{
				ST=i;
				break;
			}
		}
	}

代码:(好想她不过肯定不会被看到)

#include<bits/stdc++.h>
using namespace std;
int n,m,len=0,last[100001],fa[100001],p[151][151];
int ans[10001],tot=0,du[10001],N=257;
int findfa(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=findfa(fa[x]);
}
void dfs(int x)
{
	for(int i=0;i<=n;i++)
	{
		if(p[x][i]) p[x][i]=p[i][x]=0,dfs(i);
	}
	ans[++tot]=x;
	return ;
}
int main() 
{
	memset(p,0,sizeof(p));memset(du,0,sizeof(du));
	scanf("%d",&m);n=257-1;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		char op[11];scanf("%s",op+1);
		p[op[1]][op[2]]=p[op[2]][op[1]]=1;	
		int fx=findfa(op[1]),fy=findfa(op[2]);fa[fx]=fy;
		du[op[1]]++,du[op[2]]++;
	}
	int cnt=0;
	for(int i=0;i<=n;i++)
	{
		if(fa[i]==i&&du[i]) cnt++;
	}
	if(cnt!=1) 
	{
		printf("No Solution");
		return 0;
	}
	int ST=-1;cnt=0;
	for(int i=0;i<=n;i++)
	{
		if(du[i]%2) 
		{
			cnt++;
			if(ST==-1) ST=i;
		}
	}
	if(cnt&&cnt!=2) 
	{
		printf("No Solution");
		return 0;
	}
	if(ST==-1)
	{
		for(int i=0;i<=n;i++) 
		{
			if(du[i]) 
			{
				ST=i;
				break;
			}
		}
	}
	dfs(ST);//printf("%c",ST);
	while(tot) printf("%c",ans[tot--]);
	return 0;
}

P3520 [POI2011] SMI-Garbage这一题的思路是看出来它是欧拉回路,那么直接判断以及找环就行。小贴士:找环的时候,找了一个点就要判出哦。

#include<bits/stdc++.h>
using namespace std;
int n,m,len=-1,last[2000001],dfsx[2000001],low[2000001],dfs_x=0;
int q[2000001],tot=0,c[2000001],cnt=0,du[2000001];
bool v[2000001];
struct pp
{
	int x,y,next;
};pp p[2000001];
void ins(int x,int y)
{
	int now=++len;
	p[now]={x,y,last[x]};last[x]=now;
	return ;
}
void dfs(int x,int st)
{
	q[++tot]=x;du[x]-=2;
	for(int i=last[x];i!=-1;i=p[i].next)
	{
		int y=p[i].y;if(v[i]) continue ;v[i]=v[i^1]=true;
		if(y==st) 
		{
			q[++tot]=y;
			return ;
		}
		dfs(y,st);
		return ;
	}
}
int main()
{
	memset(last,-1,sizeof(last));memset(v,false,sizeof(v));   
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y,c1,c2;scanf("%d%d%d%d",&x,&y,&c1,&c2);
		if(c1==c2) continue ;
		ins(x,y);ins(y,x);
		du[x]++,du[y]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(du[i]%2) 
		{
			printf("NIE\n");
			return 0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		while(du[i]) dfs(i,i),c[++cnt]=tot;
	}
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++)
	{
		printf("%d ",c[i]-c[i-1]-1);
		for(int j=c[i-1]+1;j<=c[i];j++) printf("%d ",q[j]);
		printf("\n");
	}
	return 0;
}

P7684 [CEOI2005] Depot Rearrangement开始做点难题了,这个题目花了不少时间来看,这里介绍一种天才般的做法,不妨推一下,发现区间中只出现过一次的值是不用动的,没出现的要转,出现了一次以上的要转,那么可以尝试将其转化成二分图,那么咋建呢,左边作为每一个区间的点集,有n个,右边作为m个集装箱的种类,那么不妨设计一下状态,然后发现n*m+1被进入的次数最少时是最优的那么看博客吧(https://www.luogu.com.cn/problem/solution/P7684)。说说自己的理解:这一题若是想到二分图便很好处理了,不妨假想成为一个二分图求最大匹配的算法,那么发现其实这个题目是一定会成环的(因为题目要求每个都能匹配上),所以可以直接跑欧拉路径(主要是它要输出方案,所以要欧拉路径)。放一下别人的题解:(https://blog.csdn.net/u014609452/article/details/53493294)
在这里插入图片描述
!!!
大概懂了?实现好难啊QWQ,主要是边的操作了啦。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,m,len=-1,last[1000001],t[500][500],q[1000001],tot=0;
bool v[1000001];
vector<int > pos[500][500];
struct node 
{
	int x,y;
};node ans[1000001];
struct pp
{
	int x,y,next;
};pp p[1000001];
void ins(int x,int y)
{
	int now=++len;
	p[now]={x,y,last[x]};last[x]=now;
	return ;
} 
void dfs(int x)
{
	for(int i=last[x];i!=-1;i=p[i].next)
	{
		int y=p[i].y;if(v[i]) continue ;
		v[i]=true;dfs(y);q[++tot]=i;
	}
	return ;
} 
signed main()
{
	memset(last,-1,sizeof(last));memset(v,false,sizeof(v));
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int x;scanf("%lld",&x);
			t[i][x]++;pos[i][x].push_back((i-1)*m+j);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int k=2;k<=t[i][j];k++) ins(i,j+n);
			if(t[i][j]==0) ins(j+n,i);
		}
	}len=0;
	for(int i=n+1;i<=n+m;i++)
	{
		tot=0;dfs(i);
		int to=n*m+1;
		for(int i=1;i<=tot;i++)
		{
			int x=p[q[i]].x,y=p[q[i]].y;
			if(x>n) continue ;
			ans[++len].x=pos[x][y-n][--t[x][y-n]];
			ans[len].y=to;to=ans[len].x;
		}
		if(tot) ans[++len].x=n*m+1,ans[len].y=to;
	}
	printf("%lld\n",len);
	for(int i=1;i<=len;i++) printf("%lld %lld\n",ans[i].x,ans[i].y);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++基础知识(四)---程序流程结构

C基础知识&#xff08;四&#xff09;1. 顺序结构2. 选择结构2.1 if语句2.2 switch语句2.3 选择结构案例3. 循环结构3.1 循环语句3.2 循环结构案例4. 跳转语句C中支持的三种流程结构&#xff1a;顺序结构、选择结构、循环结构顺序结构&#xff1a;程序按照顺序执行&#xff0c;…

easy-monitor3.0 nodejs性能监控和分析工具

#easy-monitor性能监控和分析工具 Easy-Monitor 3.0 https://blog.csdn.net/qq_36791889/article/details/115420116 #git地址&#xff1a;https://github.com/1981430140/easy-monitor-docker-compose.git 一、easy-monitor 服务器端安装&#xff08;docker-compose&#xff…

我说MySQL里每张表不要超过100w数据,面试官让我回去等通知?

V-xin&#xff1a;ruyuanhadeng获得600页原创精品文章汇总PDF 目录 1、面试题2、面试官心理分析3、面试题剖析 1、面试题 事务的几个特点是什么&#xff1f;数据库事务有哪些隔离级别&#xff1f;MySQL的默认隔离级别&#xff1f; 2、面试官心里分析 用mysql开发的三个基本…

操作系统4小时速成:处理机调度,调度方法,调度准则,典型的调度算法,响应比

操作系统4小时速成&#xff1a;处理机调度&#xff0c;调度方法&#xff0c;调度准则&#xff0c;典型的调度算法&#xff0c;响应比 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff…

详探XSS PayIoad

详探XSS PayIoad1.Cookie劫持2.构造GET与POST请求3.XSS钓鱼4.识别用户浏览器1.Cookie劫持 一个最常见的XSS Payload&#xff0c;就是通过读取浏览器的Cookie对象&#xff0c;从而发起“Cookie劫持”攻击 Cookie中一般加密保存了当前用户的登录凭证。Cookie如果丢失&#xff0…

码神之路项目部署(五)

这一章主要是讲解一下怎么部署上线项目 一、上线准备 腾讯云服务器一台&#xff08;2核2g&#xff09;、域名一个 &#xff08;可有可无&#xff09; 说明&#xff1a;当然了服务器的配置根据项目来选择&#xff0c;2核2g跑这个博客小项目是完全没有问题的 二、服务器安装环…

但见新人笑,那闻旧人哭,大衣哥前儿媳陈亚楠好可怜

著名爱国艺人黄安&#xff0c;曾经演唱过一首歌曲&#xff0c;名字叫作《新鸳鸯蝴蝶梦》&#xff0c;歌词写的是相当棒。比如说“由来只有新人笑&#xff0c;有谁听到旧人哭”这句歌词&#xff0c;就是农民歌唱家大衣哥&#xff0c;前儿媳陈亚楠的真实写照。 陈亚楠之所以和大衣…

迈动互联获“ISO20000信息技术服务管理体系认证证书”

近日&#xff0c;迈动互联获得“ISO20000信息技术服务管理体系标准”认证证书&#xff0c;该证书标志着迈动在IT服务管理标准领域的关键技术取得了制度流程规范性和完备性上的进一步提升。 此前&#xff0c;迈动已经获得专精特新企业评定、ISO9001质量管理体系认证、27001信息…

[附源码]java毕业设计基于协同过滤推荐的电影推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Invertible Image Signal Processing 可逆图像信号处理

摘要 未经处理的 RAW 数据是一种非常有价值的图像格式&#xff0c;可用于图像编辑和计算机视觉。然而&#xff0c;由于 RAW 数据的文件大小巨大&#xff0c;大多数用户只能访问经过处理和压缩的 sRGB 图像。为了弥合这一差距&#xff0c;我们设计了一个可逆图像信号处理 (InvIS…

Q701二叉搜索树的插入操作-递归法-刷leetcode日记

声明&#xff1a;问题描述来源leetcode 一、问题描述&#xff1a; 701. 二叉搜索树中的插入操作 难度中等400 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据…

如何支持微软邮箱OAuth2.0认证

近期收到部分使用微软邮箱的客户反映&#xff0c;在EDI系统中无法连接到他们的企业邮箱中&#xff0c;连接过程中报错&#xff1a; IMAP protocol error. 1 NO LOGIN failed…&#xff0c;经确认是微软停用了邮箱的基本验证功能&#xff0c;客户端必须使用OAuth2.0认证&#xf…

如何验证 Kubernetes YAML 文件

原文出自&#xff1a;Armo’s blog 原文作者&#xff1a;Bezalel Brandwinen,&#xff0c;Team Lead at Armo Ltd Kubernetes 在我们现在如何管理容器化应用程序方面占据了中心位置。因此&#xff0c;存在许多定义我们的 的协议&#xff0c;包括 、JSON、INI 等结构。 这使得我…

自动化测试中对数据恢复的思考与实际业务改造实践

在接口自动化测试过程中&#xff0c;构造测试数据是必不可少的一个环节&#xff0c;但如何恢复测试数据也同样值得关注。业内常见的做法有&#xff1a; 1、不恢复&#xff1a;如果是没什么影响的数据&#xff0c;不恢复也无所谓&#xff0c;缺点就是会造成大量数据冗余&#x…

2022 年 10 月区块链操作系统的开发回顾

查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在寻找区块链操作系统组件的最新进展&#xff1f;你找对地方了&#xff01;正如在我们的路线图文章中所描述的那样&#xff0c;我们一直在朝着定期且频繁的更新方向发展着&#xff0c;以便让我们的社区能够及时的了解…

【前端】Ajax

目录 一、服务器对外提供了哪些资源 二、了解Ajax 2.1什么是Ajax 2.2Ajax作用 三、jQuery中的Ajax 3.1$.get()函数的语法 3.2$.post()函数的语法 3.3$.ajax()函数的语法 四、接口 4.1接口的概念 4.2接口测试工具 4.3接口文档 一、服务器对外提供了哪些资源 如果要在…

1.1小程序内置tabbar和自定义tabbar区别

文章目录内置tabbar自定义 tabbar创建文件夹 custom-tab-bar发现小程序自定义tabBar切换颜色总是比点击慢一步switchtab报错“switchTab:fail page “pages/home/pages/message/message” is not found”直接在微信开发文档内搜索&#xff0c;出现的是自定义 tabbar &#xff0…

用HTML+CSS做一个简单好看的校园社团网页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园班级网页设计 | 我的班级网页 | 我的学校 | 校园社团 | 校园运动会 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 …

C# 零基础搭建一个简单的Asp.Net Core WebAip

下面介绍的vs2022 基于.NET 6 搭建的一个简单的Asp.Net Core WebAip 一、创建aps.net core Web Aip 1、创建一个新的Asp.Net Core WebApi 项目 启动vs2022&#xff0c;在开始页面选择“创建新项目(N)”。 选择从C#的asp.net core WbeApi 作为一个初始的WebApi模板。 点击下…

C++初阶 List的介绍和使用

作者&#xff1a;小萌新 专栏&#xff1a;初阶C 作者简介&#xff1a;大二学生 希望能和大家一起进步 博客简介&#xff1a;本篇博客会简单介绍List和它的用法 List的介绍和使用List介绍List的使用方式List的定义方式List的插入与删除push_front pop_frontpush_back pop_backi…