欧拉回路与欧拉道路

      

图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。
如果一个图只是形成一个连通所有节点的链,且每一点只走一次,则成为欧拉道路。
具有欧拉回路或欧拉道路的图称为欧拉图(简称E图)。
有向图的欧拉回路
一个有向图存在欧拉回路的前提条件是这个图是个连通图,其次要求其每个点的入度等于出度,或者其中有一个点的出度比入度大1,另一个点的入度比出度大一这样就存在一条欧拉回路。
如果其每个点的入度等于出度则从任意一点出发,可以走出一条欧拉回路,如果是第二种情况,则必须从出度大于入度 1 的点出发到入度大于出度 1 的点结束,走出一条欧拉道路。
无向图的欧拉回路
跟有向图一样,首先必须连通,其次如果最多只有两个奇点。则满足欧拉回路或欧拉道路,有奇点就从任意一个奇点出发找科形成一条欧拉道路,否则从任意一点出发都能找出欧拉回路。(注意:百度百科上是错的)

如果只是判断一个图是否能够形成欧拉回路的话,就用上面的思路:
首先根据出度跟入度的关系,判断是否满足要求
然后用判断图的连通性可以用并查集或者Dfs如果要求路径的话可以用Dfs

要是需要求出欧拉路径,就用下面这个函数。
下面这个程序,是通过遍历一个图来求其欧拉回路或欧拉道路的。如果需要打印欧拉道路,在主程序中调用,参数必须是道路的起点,另外说明的是,这样打印出来是逆序的,因此在使用的时候,应该用栈压入栈中,还有就是其对无向图和有向图遍历都有用。其实这个算法跟最小生成树prim里面每次求连接上一边最小权值的边算法一样,这个只是那个算法的一个简化。可根据那个进行理解。
[cpp] view plaincopyprint?
  1. void euler(int u)  
  2. {  
  3.     for(int v=0;v<n;v++)  
  4.     {  
  5.         if(map[u][v] && !vis[u][v])  
  6.         {  
  7.             vis[u][v] = vis[v][u] = 1;//如果是有向图的只需判断一个  
  8.             euler(v);  
  9.             printf("%d %d\n",u,v);  
  10.         }  
  11.     }  
  12. }  

uva10054 - The Necklace

这个题题意很容易理解,一个链子断了,链子上的珠子两边分别有两个值,要把所有珠子链起来的话任意两个相邻的珠子的值必须相等才行,另外要说的是第二组数据是一组很好的数据。可根据其推出是用无向图,首先判断是否满足每个点都是偶点(因为是回路,不是道路)。然后利用上面欧拉代码遍历输出即可。

[cpp] view plaincopyprint?
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <stack>  
  4. #define Max 60  
  5. using namespace std;  
  6. int map[Max][Max];  
  7. int in[Max];  
  8. struct E{ int u, v; } tmp;  
  9. stack <E> st;  
  10.   
  11. void euler( int u )  
  12. {  
  13.     for ( int v = 1; v < n; ++v ) if ( map[u][v] )  
  14.     {  
  15.         map[u][v]--; map[v][u] = map[u][v];  
  16.         euler( v );  
  17.         tmp.u = u, tmp.v = v;  
  18.         st.push(tmp);  
  19.     }  
  20. }  
  21. int main()  
  22. {  
  23.     int n,T,a,b;  
  24.     scanf("%d",&T);  
  25.     for(int cas=1;cas<=T;cas++)  
  26.     {  
  27.         scanf("%d",&n);  
  28.         memset(map,0,sizeof(map));  
  29.         memset(in,0,sizeof(in));  
  30.         //memset(out,0,sizeof(out));  
  31.         for(int i=0;i<n;i++)  
  32.         {  
  33.             scanf("%d%d",&a,&b);  
  34.             ++in[a];++in[b];  
  35.             ++map[a][b];  
  36.             map[b][a]=map[a][b];  
  37.         }  
  38.         bool ok=true;  
  39.         for(int i=0;i<=50;i++)  
  40.         {  
  41.             if(in[i]%2)  
  42.                 ok=false;  
  43.         }  
  44.         printf("Case #%d\n",cas);  
  45.         if(!ok)  
  46.         printf("some beads may be lost\n");  
  47.         else  
  48.         {  
  49.             euler(a);  
  50.             while ( !st.empty() ) {  
  51.                 tmp = st.top(); st.pop();  
  52.                 printf("%d %d\n", tmp.u, tmp.v);  
  53.             }  
  54.         }  
  55.         printf("\n");  
  56.     }  
  57.     return 0;  
  58. }  


UVA10129 - Play on Words 这道题题意是给出n个单词,让每个点此的首字母指向未字母形成连通,这样形成一个有向图,求这个有向图的欧拉回路。

思想就是:首先读入图,然后根据出度和入度判断是否满足,单手Dfs判断连通性。
[cpp] view plaincopyprint?
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<math.h>  
  4. int visit[26],a[26][26];  
  5. void dfs(int x)  
  6. {  
  7.     int i;  
  8.     visit[x]=0;  
  9.     for (i=0;i<26;i++)  
  10.     if ((visit[i]==1)&&(a[x][i]==1)) dfs(i);  
  11. }  
  12. int main()  
  13. {  
  14.     int f,t,k1,k2,num,n,i,j,l,in[26],out[26];  
  15.     char s[1010];  
  16.     scanf("%d",&t);  
  17.     while (t--)  
  18.     {  
  19.         memset(a,0,sizeof(a));  
  20.         for (i=0;i<26;i++)  
  21.         {in[i]=0; out[i]=0; visit[i]=0;}  
  22.         scanf("%d\n",&n);  
  23.         while (n--)  
  24.         {  
  25.             gets(s); l=strlen(s);  
  26.             k1=s[0]-'a'; k2=s[l-1]-'a';  
  27.             ++in[k1]; ++out[k2];  
  28.             visit[k1]=1; visit[k2]=1;  
  29.             a[k1][k2]=1;  
  30.             num=k1;  
  31.         }  
  32.         for (i=0;i<26;i++)  
  33.         in[i]=in[i]-out[i];  
  34.         f=0; k1=0; k2=0;  
  35.         for (i=0;i<26;i++)  
  36.         {  
  37.             if (in[i]==-1) ++k1;  
  38.             else if (in[i]==1)  {++k2;num=i;} //因为是有向图,如果不是欧拉回路的情况,随便找个点为起点dfs不一定能遍历所有点,如3 a b b c c d只能以a为起点否则就会判断连通性错误  
  39.             else if (in[i]!=0)  f=1;  
  40.         }  
  41.   
  42.         if (f==0)  
  43.         {  
  44.             if ((k1+k2==0) || ((k1==1)&&(k2==1)))  
  45.             {  
  46.                 dfs(num);  
  47.                 for (i=0;i<26;i++)  
  48.                 f+=visit[i];  
  49.             }  
  50.             else f=1;  
  51.         }  
  52.         if (f!=0) printf("The door cannot be opened.\n");  
  53.        else printf("Ordering is possible.\n");  
  54.   
  55.     }  
  56.     return 0;  
  57. }  
  58.  

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

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

相关文章

小心DLL链接静态库时的内存错误

最近写的模块&#xff0c;在独立的应用程序中测试是没问题的&#xff0c;但把它装配成DLL后&#xff0c;再在另一个应用程序中调用时却出现了内存错误。程序的模块链接关系大概是这样的&#xff1a; module就是我所写的模块&#xff0c;在这里被封装为DLL&#xff0c;因为要使用…

阿里试用,女朋友逼着我给她排序

阿里试用排序 抱歉&#xff0c;之前莫名其妙把配置文件给 ignore 了&#xff0c;已经修复&#xff0c;抱歉 前景提要 说来简直丢尽了钢铁直男的脸&#xff0c;没错&#xff0c;昨晚我在愉快的做着外包的活&#xff08;中国移动的小程序&#xff0c;自由职业&#xff0c;喂&…

用于Elasticsearch成绩单的Java客户端

在本演讲中&#xff0c;我将介绍用于Elasticsearch和Spring Data Elasticsearch的三个不同的客户端。 首先&#xff0c;让我们看一下Elasticsearch的一些基础知识。 弹性搜索 为了介绍elasticsearch&#xff0c;我使用的定义直接来自Elastic网站。 Elasticsearch是基于JSON的…

springmvc是什么_当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?

前文Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&#xff0c;简化开发&#xff0c;减少出…

怎么用python画饼状图_Python入门进阶:Python绘制饼图到Microsoft Excel

原标题&#xff1a;Python入门进阶&#xff1a;Python绘制饼图到Microsoft Excel 来自&#xff1a;Linux迷https://www.linuxmi.com/python-pie-chart-microsoft-excel.html 在本文中&#xff0c;我想向您展示使用Python向Microsoft Excel绘制饼图&#xff0c;为此我们将使用Xl…

Linux系统Shutdown命令定时关机详解

Linux系统下的shutdown命令用于安全的关闭/重启计算机&#xff0c;它不仅可以方便的实现定时关机&#xff0c;还可以由用户决定关机时的相关参数。在执行shutdown命令时&#xff0c;系统会给每个终端&#xff08;用户&#xff09;发送一条屏显&#xff0c;提示关机操作。定时关…

_ASSERTE(_CrtIsValidHeapPointer(pUserData))错误详解

可能原因&#xff1a;DLL和EXE主程序使用的不是同一个堆造成。 解决办法&#xff1a; 1. 采用谁分配谁释放的原则&#xff1b; 2. 绕过 new 和 delete&#xff0c;使用 GlovalAlloc 和 GlobalFree&#xff1b; 3. 更改工程选项&#xff0c; release 版本肯定不会出现这个失败&a…

【机器学习】【线性回归】梯度下降

文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现导包数据预处理迭代过程数据可视化完整代码 线性拟合结果代价结果 个人主页&#xff1a;丷从心 系列专栏&#xff1a;机器学习 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , …

python api是什么_Python/C API

Python/C API Python/C API可能是被最广泛使用的方法。它不仅简单&#xff0c;而且可以在C代码中操作你的Python对象。 这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的Python对象都被表示为一种叫做PyObject的结构体&#xff0c;并且Python.h头文件中提供了各…

Sublime Text插件列表

本文由伯乐在线 - 艾凌风 翻译&#xff0c;黄利民 校稿。英文出处&#xff1a;ipestov.com。欢迎加入翻译组。本文收录了作者辛苦收集的Sublime Text最佳插件&#xff0c;很全。 最佳的Sublime Text 插件 朋友们你们好&#xff01;我尝试着收集了最佳的ST插件&#xff0c;这些插…

C语言sendto()函数:经socket传送数据

相关函数&#xff1a;send, sendmsg, recv, recvfrom, socket头文件&#xff1a;#include <sys/types.h> #include <sys/socket.h>定义函数&#xff1a;int sendto(int s, const void * msg, int len, unsigned int flags, const struct sockaddr * to, int tole…

javaone_JavaOne 2012:向上,向上和向外:使用Akka扩展软件

javaone在晚些时候的社区主题演讲之后&#xff0c;我前往希尔顿金门大桥3/4/5观看了维克多巴生 &#xff08; Viktor Klang &#xff09;的&#xff08; Typesafe &#xff09;“向上&#xff0c;向上和向外&#xff1a;Akka”演讲。 巴生&#xff08;Klang&#xff09;是Akka的…

Windows平台下动态链接库的总结

1、 动态链接库与静态连接库 静态连接库与动态链接库都是经过编译器编译之后的&#xff0c;在计算机上可以直接运行的二进制目标文件&#xff0c;就像exe文件一样&#xff0c;但不同于exe文件的是静态链接库和动态链接库不可以独立运行&#xff0c;一般而言&#xff0c;动态链接…

python建模分析实操_城市公交站点设置优化模型-基于Python

城市公交站点设置的优化分析 一、模型应用 进入21世纪以来&#xff0c;我国城市公共交通飞速发展&#xff0c;然而随着经济社会发展&#xff0c;城市不断升级以及人民生活品质越来越好&#xff0c;城市交通拥堵、出行不便等问题日益突出&#xff0c;严重损坏了市民日常的生活体…

【递归:把目录下所有文件的绝对路径给输出在控制台】

package com.bornsoft.test.capitalpool.tyc;import java.io.File;/*** author shusheng* description* Email shushengyiji.com* date 2018/10/16 10:26*/ public class DiGuiDemo2 {/***需求&#xff1a;请大家把目录下所有文件的绝对路径给输出在控制台*分析&#xff1a;*A:…

UDP sendto和recvfrom使用详解

在网络编程中&#xff0c;UDP运用非常广泛。很多网络协议是基于UDP来实现的&#xff0c;如SNMP等。大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的。 本篇文章跟大家分享linux下UDP的使用和实现&#xff0c;主要介绍下sendto()和recvfrom()两个函数的使用&#xf…

SpringOne Platform 2016回顾

我最近结束了在拉斯维加斯参加SpringOne Platform会议的总结。 这是我第一次参加SpringOne。 这是聆听演讲并与软件开发领域的一些顶级专家进行对话的一种体验。 如果您没有参加SpringOne&#xff0c;那么您肯定会想要阅读这篇文章。 我们将介绍这四个主题&#xff0c;以及如何…

欧姆龙cp1hum读保护解密步骤_欧姆龙PLC的NJ系列NJ产品功能介绍

欧姆龙PLC的NJ 系列NJ运动、逻辑和视觉集于一体欧姆龙PLC的NJ 系列NJ特点One Machine Control运动、逻辑和视觉集于一体将组成机械所需的各种控制设备汇集于一体&#xff0c;使用一个软件即可进行控制。 这就是Sysmac自动化平台的努力目标。 我们的新型机器自动化控制器NJ系列通…

关于CUDA和CuDNN配置的小问题

为了方便组员操作&#xff0c;简单写一下CUDA的配置啦。 首先你需要一台电脑&#xff0c;有NVDIA显卡的那种&#xff08;就那个煤气灶&#xff0c;你懂我意思吧&#xff09;&#xff0c;然后就继续往下走吧&#xff0c;如果没有的话可以找一下右上角的红叉了&#xff0c;这篇文…

PyMongo--非关系型数据库mongodb入门(一步一步 版)

PyMongo--非关系型数据库mongodb入门&#xff08;一步一步 版&#xff09; 本文主要内容&#xff1a; 1.简要介绍mongodb 2.Pymongo 3.mongo shell 4.我的mongodb入门之旅 1.简要介绍mongodb MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的…