P1341 欧拉回路

2023-10-22 10:51
文章标签 欧拉 回路 p1341

本文主要是介绍P1341 欧拉回路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 为什么会这样。。。。

我从下午起床,写到晚上睡觉的一题。

我就搞不懂了。。。cin>>s;

和getchar()到底哪里不同了。。。。

我很生气

这个测试点,怎么就过不去了????

用 cin>>s就完全没有问题。。。

我枯了。。。????

 

 


  • 题意

虽然之前学过离散数学,但是还是没有想到这题其实 求字典序最小的欧拉回路(成环)或欧拉路径(未成环)。

参考博客:欧拉回路/路径【总结】

讲的很透彻的洛谷题解


  • 划重点

欧拉路径:在一个图中,由i点出发,将每个边遍历一次最终到达j点的一条路径。 
欧拉回路: i=j时的欧拉路径。  (兜兜转转又回到了起点)

无向图:

                欧拉回路:每个点的度数都是偶数

                欧拉路径:(从奇数到奇数)如果有且仅有两个点的度数为奇数,就会存在一条从这两个中的一个到达另一个的欧拉

                                     路径。

有向图:

                欧拉回路:(有进必有出)所有点的入度等于出度,就存在一条欧拉回路。 

                欧拉路径::最多有一点入度等于出度+1,最多有一点入度等于出度-1,就会有一条从出度大于入度(没有则等于)                                         的点出发,到达出度小于入度(没有则等于)的点的一条欧拉路径。


  • 思路

首先,判断这个无向图是否连通。并查集判断,也就是大家都是一个父亲喽。

接着,判断是不是存在欧拉回路或路径。

如果存在,就要利用dfs 得到路径:

             首先,出发点我们在证明中已经确定,只需要保留路径时由后往前保存,再利用深搜回溯的过程,我们可以保证不会走    死胡同(其实是走了死胡同,但保存路径时会把这段路留到最后,就相当于没有走死)。 


  • 代码

//P1341
#include<iostream>
#include<algorithm>
#include<set>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<stdio.h>
using namespace std;
#define ll long long
map<char,int> mp;
map<char,int>::iterator it;
int num[200][200];//graph
string s;
int pre[200];
int ex[200];int n,head;
void Init()
{for(int i=64;i<126;i++)pre[i]=i;
}int find(int x)
{if(pre[x]==x) return x;return pre[x]=find(pre[x]);
}int idx=0;
char ans[2000];
int vis[60];void dfs(int x)
{for(int i=64;i<126;i++){if(num[x][i] ){num[x][i]=num[i][x]=0;dfs(i);}}ans[n--]=x;}int main()
{scanf("%d",&n);int nn=n;getchar();Init();for(int i=1;i<=n;i++){cin>>s;//        s[0]=getchar();
//        s[1]=getchar();
//        getchar();num[s[0]][s[1]]=num[s[1]][s[0]]=1;ex[s[0]]++;ex[s[1]]++;int x=find(s[0]);int y=find(s[1]);pre[x]=y;}int cnt=0;for(int i=64;i<126;i++)if(pre[i]==i && ex[i]) cnt++;//  cout<<"cnt:"<<cnt<<endl;if(cnt!=1){cout<<"No Solution"<<endl;return 0;}cnt=0;//奇数度数的点head=0;for(int i=64;i<126;i++){if(ex[i] & 1){cnt++;if(head==0) head=i;//一定会从奇数度进入}}if(cnt && cnt!=2){cout<<"No Solution"<<endl;return 0;}if(head==0)//是欧拉回路{for(int i=64;i<126;i++){if(ex[i]){head=i;break;}}}dfs(head);cout<<ans<<endl;return 0;}

 

这篇关于P1341 欧拉回路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260972

相关文章

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

nyoj99(并查集+欧拉路+dfs)

单词拼接 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串。 前一个单词的结尾应该与下一个单词的道字母相同。 如 aloha dog arachnid gopher tiger rat   可以拼接成:aloha.arachnid.dog.gopher.rat.tiger 输入 第一行是一个整

nyoj42(并查集解决欧拉回路)

一笔画问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。   输入 第一行只有一个正整数N(N<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

JD 1027:欧拉回路

OJ题目:click here~~ 题目分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉路径的图称为欧拉图(简称E图)。 无向图存在欧拉回路的充要条件: 一个无向图存在欧拉回路,当且仅当该图拥有奇数度数的顶点的个数为0且该图是连通图。 有向图存在欧拉回路的充要条件: 一

欧拉数据库的搭建及其部署

数据库的搭建 进行数据库安装前,必须保证软件yum仓库搭建完成 使用命令 dnf install mariadb-server,发现冲突selinux-policy-targeted-35.5-21.oe2203sp3.noarch有问题 [root@localhost yum.repos.d]# dnf install mariadb-server [root@localhost yu

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录,创建docker-ce.repo文件 [root@localhost yum.repos.d]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源,镜像源在编辑中需要单独复制 https://mirr

【UVa】 10735 Euler Circuit 混合图的欧拉回路 最大流

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1676 题目要求:求混合图的欧拉回路+输出路径。 题目分析: 先看一段比较流行的说法吧~: -----------------------------------------