离散数学 欧拉图实验
离散数学课件15.1欧拉图
推论的证明(充分性):Fleury算法
构造性证明 1.任取一个顶点 2.寻找没有走过的并且不是余图的 桥的关联边(除非别无选择),到达下 一个顶点. 3.重复2,直至无边可走.
例
1.是欧拉图; 2.不是欧拉图,但存在欧拉通路; 3.既不是欧拉图,也不存在欧拉通路。
只具欧拉通路,无欧拉回路的图不是 欧拉图.
(1)既无欧拉回路,也无欧拉通路. (2)中存在欧拉通路,但无欧拉回路. (3)中存在欧拉回路.
例
图a)存在一条欧拉通路:v3v1v2v3v4v1; 图 (b) 中 存 在 欧 拉 回 路 v1v2v3v4v1v3v1 , 因 而 (b) 是欧拉图; 图(c)中有欧拉回路v1v2v3v4v5v6v7v8v2v4v6v8v1因 而(c)是欧拉图。
P326: 3., 4
课堂练习
课后作业: P323: 2 ,5
有向图的Euler图
定理: 一个有向图D具有欧拉通 路,当且仅当D是连通的,且除了 两个顶点外,其余顶点的入度均 等于出度.这两个特殊的顶点中, 一个顶点的入度比出度大⒈另 一个顶点的入度比出度小1.
推论: 一个有向图D是欧拉图(具有欧 拉回路),当且仅当D是连通的,且所有 顶点的入度等于出度.
例(蚂蚁比赛问题)
甲、乙两只蚂蚁分别位 于如下图中的结点a,b 处,并设图中的边长度 是相等的。甲、乙进行 比赛:从它们所在的结 点出发,走过图中的所 有边最后到达结点c处。 如果它们的速度相同, 问谁先到达目的地?
2.一笔画问题
有向图的Euler图
给定G是一个无孤立结点的有 向图,若存在一条单向通路 (回路),经过图中每边一次且 仅仅一次,则称此单向通路 (回路)为该图的一条单向欧拉 通路(回路)。具有单向欧拉回 路的图称为欧拉图。
离散数学课件15欧拉图与哈密顿图
下面设G为非平凡图,设G是m条边的n阶无 向图,
并设G的顶点集V={v1,v2,…,vn}。 必要性。因为G为欧拉图,所以G中存在欧 拉回路,
设C为G中任意一条欧拉回路,vi,vj∈V, v2i0,2v0/7j/都23 在C上,
定理15.1的证明
充分性。由于G为非平凡的连通图可知,G中边数 m≥1。
2020/7/23
半欧拉图的判定定理
定理15.2 无向图G是半欧拉图当且仅当G是连通的 ,且G中恰有两个奇度顶点。
证明 充分性。设G的两个奇度顶点分别为u0和v0, 对G加新边(u0,v0),得G =G∪(u0,v0), 则G 是连通且无奇度顶点的图, 由定理15.1可知,G 为欧拉图, 因而存在欧拉回路C ,而C=C -(u0,v0)为G中一 条欧拉通路, 所以G为半欧拉图。
并2行从020/7遍/C23 上G 的i中某的顶欧点拉vr回开路始C行遍i,,i=每1遇,2,到…v,s*j,i,最就后
半欧拉图的判定定理
定理15.2 无向图G是半欧拉图当且仅当G是连通的 ,且G中恰有两个奇度顶点。
证明 必要性。设G是m条边的n阶无向图,因为G为 半欧拉图, 因而G中存在欧拉通路(但不存在欧拉回路), 设Г=vi0ej1vi1…vim-1ejmvim为G中一条欧拉通路, vi0≠vim。 v∈V(G),若v不在Г的端点出现,显然d(v)为偶 数, 若v在端点出现过,则d(v)为奇数,
欧拉对物理力学、天文学、弹道学、航海学、建筑学、音 乐都有研究!有许多公式、定理、解法、函数、方程、常数等 是以欧拉名字命名的。欧拉写的数学教材在当时一直被当作标 准教程。19世纪伟大的数学家高斯曾说过“研究欧拉的著作永 远是了解数学的好方法”。欧拉还是数学符号发明者,他创设 的许多数学符号,例如π,i,e,sin,cos,tg,Σ,f (x)等等, 至今202沿0/7/2用3 。
离散数学 欧拉图实验
1、欧拉图判定和应用【实验内容】 判断一个图是不是,如果是,求出所有欧拉路【实验原理和方法】(1)用关系矩阵R=n n ij r )(表示图。
(2)对无向图而言,若所有结点的度都是偶数,则该图为欧拉图。
C 语言算法:flag=1;for(i=1;i<=n && flag;i++){sum=0;for(j=1;j<=n;j++)if(r[i][j]) sum++;if(sum%2==0) flag=0;}如果 flag 该无向图是欧拉图(3)对有向图而言,若所有结点的入度等于出度,则该图为欧拉图。
C 语言算法:flag=1;for(i=1;i<=n && flag;i++){sum1=0;sum2=0;for(j=1;j<=n;j++)if(r[i][j]) sum1++;for(j=1;j<=n;j++)if(r[j][i]) sum2++;if(sum1%2==0 || sum2%2==0) flag=0; }如果 flag 该有向图是欧拉图(4)求出欧拉路的方法:欧拉路经过每条边一次且仅一次。
可用回溯的方法求得所有欧拉路。
C 语言算法:int count=0,cur=0,r[N][N]; // r[N][N]为图的邻接矩阵,cur 为当前结点编号,count 为欧拉路的数量。
int sequence[M];// sequence 保留访问点的序列,M 为图的边数输入图信息;void try1(int k) //k 表示边的序号{int i,pre=cur; //j保留前一个点的位置,pre为前一结点的编号for (i=0;i<N;i++)if (r[cur][i]) //当前第cur点到第i点连通{//删除当前点与第i点的边,记下第k次到达点i,把第i个点设为当前点r[cur][i]=0;cur=sequence[k]=i;if (k<M) try1(k+1); //试下一个点else prt1();//经过了所有边,打印一个解//上面条件不满足,说明当前点的出度为0,回溯,试下一位置r[pre][i]=1;cur=pre;}}2、最优二叉树的应用【实验内容】最优二叉树在通信编码中的应用。
图的随机生成及欧拉(回)路的确定讲解
《离散数学》实验报告(2015 / 2016 学年第一学期)题目:图的随机生成及欧拉(回)路的确定专业信息安全学生姓名班级学号指导教师指导单位计算机学院计算机科学与技术系日期2015年12月29日图的随机生成及欧拉(回)路的确定一、实验内容和要求内容:编程随机生成n个结点的无向图并能进行(半)欧拉图的判定,若是则给出欧拉(回)路。
要求:对给定n个结点,随机生成邻接矩阵以确定某无向简单图并进行欧拉图和半欧拉图的判定,若符合则给出至少一条欧拉回路或欧拉路。
二、实验目的对给定n个结点,随机生成邻接矩阵以确定某无向简单图并进行欧拉图和半欧拉图的判定,若符合则给出至少一条欧拉回路或欧拉路。
三、实验任务1、输入结点个数据生成随机图2、进行(半)欧拉图的判定3、若是则给出欧拉(回)路。
四、实验内容#include <iostream>#include <ctime>#include <cstdlib>using namespace std;class Euler{public:Euler(int num);~Euler();void DFS(int begin); //公有的深度优先搜索函数void inputEdge(); //输入边void PrintAM(); //打印邻接矩阵void PrintRM(); //打印可达性矩阵void Warshall(); //Warshall算法求可达性矩阵bool IsConnected(); / /判断图是否连通int IsEorSE(); //判断图是欧拉图还是半欧拉图bool isEuler;private:void DFS(int u,int v,bool **visited); / /私有的深度优先搜索函数int n;int **a; //定义动态二维数组int **p; //定义可达性矩阵int *b; //存储每个结点的度数};Euler::Euler(int num) //构造函数{isEuler=false;n=num;int i,j;a=new int*[n];for(i=0;i<n;i++){a[i]=new int[n];for(j=0;j<n;j++)a[i][j]=0;}p=new int*[n];for(i=0;i<n;i++){p[i]=new int[n];for(j=0;j<n;j++)p[i][j]=0;}b=new int[n];for(i=0;i<n;i++)b[i]=0;}Euler::~Euler()//析构函数{int i;for(i=0;i<n;i++) delete []a[i];delete []a;for(i=0;i<n;i++) delete []p[i];delete []p;delete []b;}void Euler::inputEdge(){srand((unsigned)time(NULL));for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){a[i][j] = 0+rand()%2; //随机生成无向图a[j][i]=a[i][j];}}for(int ii=0;ii<n;ii++){for(int jj=0;jj<n;jj++){if(a[ii][jj]==1){p[ii][jj]=1;p[jj][ii]=1;}}}}void Euler::PrintAM(){cout<<"随机生成的图为:"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<a[i][j]<<" ";cout<<endl;}}void Euler::Warshall(){for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(p[j][i]==1){for(int k=0;k<n;k++){if(p[j][k]+p[i][k]>0)p[j][k]=1;}}}void Euler::PrintRM(){cout<<"可达性矩阵:"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<p[i][j]<<" ";cout<<endl;}}bool Euler::IsConnected(){int i,j;bool flag=true; / /flag标记是否连通for(i=0;i<n;i++){for(j=0;j<n;j++)if(p[i][j]==0) //如果可达性矩阵中有一个元素为0,{ //就跳出循环,表示该图不连通flag=false;break;}if(!flag)break;}if(!flag)cout<<"该图不是连通的";else{for(i=0;i<n;i++)for(j=i;j<n;j++){if(a[i][j]==1&&i!=j) //由边计算结点的度数{b[i]++;b[j]++;}}}return flag;}int Euler::IsEorSE(){int i,count=0,begin=-1;cout<<"每个结点的度数:"<<endl;for(i=0;i<n;i++)cout<<i<<":"<<b[i]<<endl;for(i=0;i<n;i++)//计算奇数结点的个数if(b[i]%2!=0){count++;begin=i;//初始化开始结点,存在奇数结点,则将其中一个作为开始点}if(begin==-1)//不存在奇数结点则将0作为起始点begin=0;if(count==2){cout<<"该图是半欧拉图"<<endl;isEuler=true;//isEuler标记是否是(半)欧拉图}else if(count==0){cout<<"该图是欧拉图"<<endl;isEuler=true;}return begin;}void Euler::DFS(int begin){int i,j;bool **visited=new bool*[n];//二维数组记录每条边是否被访问过for(i=0;i<n;i++)//初始化{visited[i]=new bool[n];for(j=0;j<n;j++)if(a[i][j]==1)visited[i][j]=false;elsevisited[i][j]=true;}for(j=0;j<n;j++)if(!visited[begin][j]){DFS(begin,j,visited);cout<<begin<<" ";}for(i=0;i<n;i++) delete []visited[i];//释放内存delete []visited;}void Euler::DFS(int u,int v,bool **visited){if(!visited[u][v])//判断边<u,v>是否访问过{visited[u][v]=true;visited[v][u]=true;//标记被访问for(int i=0;i<n;i++)DFS(v,i,visited);cout<<v<<" "; //输出结点}}int main(){int n,m,begin;bool flag;cout<<"输入结点个数:";cin>>n;Euler euler(n);euler.inputEdge();euler.PrintAM();euler.Warshall();euler.PrintRM();flag=euler.IsConnected();if(flag){begin=euler.IsEorSE();if(euler.isEuler){cout<<"具体路径为:";euler.DFS(begin);}}cout<<endl;return 0;}五、测试数据及其结果分析六、调试过程中的问题可达性矩阵无法正确计算,调试后发现是算法中未正确定义循环变量七、程序设计总结1.掌握了与离散数学理论相关的编程实现思想和方法,掌握了欧拉图和半欧拉图的判定。
《离散数学》课件-第15章欧拉图与哈密顿图
例如
彼得松图 彼得松图满足定理15.6,但不是哈密顿图。
例15.3 下图中三个图都是二部图,判断它们 哪些是哈密顿图,哪些是半哈密顿图?
G1
G2
G3
二部图与哈密顿图的关系
设二部图G=<V1,V2,E>,
|V2||V1|。若|V2||V1|+2,则
G即不是哈密顿图,又不是半哈
G1
密顿图
(1)G1=<V1,V2,E>, 互补顶点子集为V1={a,f},V2={b,c,d,e}。 则p(G1-V1)=|V2|=4,|V1|=2, p(G1-V1)>|V1|且p(G1-V1)>|V1|+1。 所以G1即不是哈密顿图,又不是半哈密顿图。
亚瑟王和他的骑士们
◼ 亚瑟王一次召见他的p个骑士,已知每一个 骑士在骑士中的仇人不超过p/2-1个。证明:能让 这些骑士围坐在圆桌旁,使每个人都不与他的仇 人相邻。
其它重要的定理
◼ 定理1 如果G是一个n(n3)阶简单图, 且n/2,则G是哈密顿图。
◼ 定理2 如果G是一个n(n3)阶完全图, 且n为奇数,则G是哈密顿图且图中有(n-1)/2个 边不相交的哈密顿回路。
穿过每一道门,通过所有房间?
15.2 哈密顿图
1859年,爱尔兰数学家威廉·哈密尔顿发明 了一个旅游世界的游戏。将一个正十二面体的 20个顶点分别标上世界上大城市的名字,要求 玩游戏的人从某城市出发沿12面体的棱,通过 每个城市恰一次,最后回到出发的那个城市。
哈密尔顿游戏是在左图中如何 找出一个包含全部顶点的圈。
点的回路称为欧拉回路 定义(欧拉图和半欧拉图)
具有欧拉回路的图称为欧拉图 具有欧拉通路无欧拉回路的图称为半欧拉图 规定平凡图是欧拉图
离散数学--第十五章 欧拉图和哈密顿图
实例
在上图中, (1),(2) 是哈密顿图; (3)是半哈密顿图; (4)既不是哈密顿图,也不是半哈密顿图,为什么?
14
无向哈密顿图的一个必要条件
定理15.6 设无向图G=<V,E>是哈密顿图,对于任意V1V且 V1,均有 p(GV1) |V1|
证 设C为G中一条哈密顿回路。
当V1顶点在C上均不相邻时, p(CV1)达到最大值|V1|,
求图中1所示带权图k29主要内容欧拉通路欧拉回路欧拉图半欧拉图及其判别法哈密顿通路哈密顿回路哈密顿图半哈密顿图带权图货郎担问题基本要求深刻理解欧拉图半欧拉图的定义及判别定理深刻理解哈密顿图半哈密顿图的定义
第十五章 欧拉图与哈密顿图
主要内容
➢ 欧拉图 ➢ 哈密顿图 ➢ 带权图与货郎担问题
1
15.1 欧拉图
大时,计算量惊人地大
27
例6 求图中(1) 所示带权图K4中最短哈密顿回路.
(1)
(2)
解 C1= a b c d a,
W(C1)=10
C2= a b d c a,
W(C2)=11
C3= a c b d a,
W(C3)=9
可见C3
(见图中(2))
是最短的,其权为9. 28
第十五章 习题课
主要内容 欧拉通路、欧拉回路、欧拉图、半欧拉图及其判别法 哈密顿通路、哈密顿回路、哈密顿图、半哈密顿图 带权图、货郎担问题
点.
由vi 的任意性,结论为真. 充分性 对边数m做归纳法(第二数学归纳法). (1) m=1时,G为一个环,则G为欧拉图. (2) 设mk(k1)时结论为真,m=k+1时如下证明:
5
从以上证明不难看出:欧拉图是若干个边不重的圈之 并,见示意图3.
离散数学欧拉图
欧拉图的判断方法
在计算机科学中,欧拉图还可用于描述有向图(Directed Graph) 的路径问题,例如,欧拉路径(Euler Path)和欧拉回路 (Eulerian Circuit) 欧拉路径是指一条路径包含图中所有的边恰好一次。而欧拉回路 是指一条闭合路径包含图中所有的边恰好一次。一个图存在欧拉 回路当且仅当该图的每条边的权值都是偶数 在复杂网络理论中,欧拉图可以用于描述网络的结构和行为,例 如社交网络、互联网、脑科学等领域的网络。在这些网络中,节 点代表个体或事件,边代表它们之间的联系或互动。通过对这些 网络进行分析,可以发现它们的结构和行为规律,从而更好地理 解和预测网络的行为 此外,欧拉图还可以用于构建和分析化学分子的结构。在化学中, 欧拉图是一种用于表示分子结构的图形,其中顶点代表原子,边 代表化学键。通过分析欧拉图,可以了解分子的结构、性质和反 应行为等信息
在这个图中,每个顶点都有偶数条边连接,并且存在一条路径(A---B---C---D---E---F--A)包含所有顶点,且每个边都只经过一次
欧拉图的性质
欧拉图的性质
欧拉图具有以下性质 欧拉图的边数一定是偶数 欧拉图一定是连通的(即所有顶点之间都有路径相连) 欧拉图中的任何两个顶点之间都有偶数条边相连 如果一个图是欧拉图:那么它的每个子图都是欧拉图
欧拉图的判断方法
对于一个连通图:如果它的所有边都可以被一个2-因子覆盖(即每个顶点都在两个2因子中出现),那么这个图是欧拉图。否则,这个图不是欧拉图 对于一个连通图:如果它可以被分解成两个子图,每个子图都包含所有的顶点并且所 有边的数量相同,那么这个图是欧拉图。否则,这个图不是欧拉图
对于一个连通图:如果它可以被分解成两个子图,每个子图的边数相同并且所有顶点 的度数相同(即每个顶点的度数都是偶数),那么这个图是欧拉图。否则,这个图不 是欧拉图。除了以上方法,还有一些复杂的方法可以判断一个图是否为欧拉图,例如 通过检查图的子图或者通过编程实现图的遍历算法。这些方法需要更深入的图论知识 和计算机科学知识,但它们可以提供更准确和高效的结果
《离散数学》 第八章 欧拉图与哈密尔顿图
1 10 1
8.1 欧拉图
8.1.4 欧拉图的应用
欧拉图的应用,计算机旋转鼓轮的设计原理。
现在构造一个有向图G,G有8个顶点,每个顶点分别表示 000~111的一个二进制数。设α i∈{0,1},从顶点α 1α 2α 3 引出两条有向边,其终点分别为α 2α 30和α 2α 31,这两条边 分别为α 1α 2α 30以及α 1α 2α 31,按照此种方法,对于八个 顶点的有向图共有16条边,在这个图的任意一条通路中,其 邻接的边必是α iα jα kα t和α jα kα tα s的形式,即前一条有 向边的后3位与后一条有向边的前3位相同。因为图中的16条 边被记成不同的4位二进制信息,即对应于图中的一条欧拉 回路。
推论 无向连通图中顶点与间存在欧拉通路,当且仅当中 与的度数为奇数,而其他顶点的度数为偶数。
8.1 欧拉图
8.1.2 欧拉图的判定
b
a
d
c
图8.1-2
v1
v2
v1
v3
v4
v5
v6
v2
(a)
图8.1-3
v4
v3 (b)
8.1 欧拉图
8.1.2 欧拉图的判定
定理8.1.3 有向图是欧拉图,当且仅当是强连通的,且 中每个顶点的入度都等于出度。
8.2 哈密尔顿图
8.2.1 哈密尔顿图
在图8.2-2中,(a)、(b)中存在哈密尔顿回路,是哈密 尔顿图,(c)中存在哈密尔顿通路,但不存在哈密尔顿回 路,是半哈密尔顿图,(d)中既无哈密尔顿回路,也无哈 密尔顿通路,不是哈密尔顿图。
( a)
( b)
( c)
( d)
8.2 哈密尔顿图
8.2.2 哈密尔顿图的判定
离散数学 欧拉图
如图中, (1), (4)为欧拉图; (2), (5)为半欧拉图; (3),(6)既不是欧拉图, 也不是半欧拉图. 在(3), (6)中各至少加几条边才能成为欧拉图?
12
思考: 1. 如图所示的街区,试问甲、乙二人以同样的速度分别 从A.B处同时出发走遍所有街道而谁先到达C处?
2. 一只昆虫是否可以从立方体的一个顶点出发,沿着棱 爬行经过每一条棱一次且仅一次,并且最终回到原地.
5
由此,欧拉得到如下结论:
当连通图的各个顶点都是偶数度时,该图可 以一笔画,且始点和终点重合。
当一个图中仅有两个奇数度点时,该图也可以一笔画,但必须 把其中一个奇数度点作为起点,另一个奇数度点作为终点。 6
二、欧拉定理
定义1 如果图中存在一条通过各边一次且仅 一次的回路,称此回路为欧拉回路或 称为欧拉圈。
18
这个问题是我国数学家管梅谷教授于 1960年首先提出解决的,所以国际上常 称为中国邮路问题
19
如果邮递员所走街道的图形是一个欧拉图, 则中国邮路问题可以理解为图中任何一条欧 拉回路都是最优回路。
如果图中有度数为奇数的顶点,如图中各边上 的权为街道的长度。
20
图中有两个度数为奇数的顶点:B和E,可以把构成B到 E的一条通路的各边都增加一条重复边(即平行边)。
8
由此,在七桥问题中,其4个顶点都是奇数度点, 所以,七桥图不是欧拉图,也不是半欧拉图。 因此,这个图不可能一笔画成。
9
欧拉图是连通的且若干个边不重的圈之并,见示意图
PLAY
10
如图9.30(a)的每一个结点的度数都是偶数2,所以(a)中 有一个欧拉回路,是欧拉图;在图9.30 (b)中有两个结点的 度数是奇数3,故 (b)中有一个欧拉通路,但没有欧拉回路, 不是欧拉图;在图9.30 (c)中四个结点的度数都是奇数3, (c)中没有欧拉通路,更没有欧拉回路,不是欧拉图。
《离散数学》 第八章 欧拉图与哈密尔顿图
8.1 欧拉图
8.1.4 欧拉图的应用 欧拉图的应用,计算机旋转鼓轮的设计原理。
将旋转鼓轮的表面分成2n段,例如,将 图8.1-5所示的旋转鼓轮的表面分成 24=16段,每段由绝缘体或导电体组成, 绝缘体将给出信号0,导电体将给出信 号1。鼓轮的表面还有4个触点0,根据 鼓轮的一个确定位置,就可读出一个4 位二进序列。
(3)具有欧拉回路的图,称为欧拉图;
(4)具有欧拉通路但无欧拉回路的图,称为半欧拉图。
8.1 欧拉图
8.1.1 欧拉图的定义
在图8.1-1中,(a)存在欧拉通路,但不存在欧拉回路,因 而它不是欧拉图。(而a ) (b)中存在欧拉回路,所以(b( b)) 是 欧拉图。
v1
v1
v4
v2
v4
v3 (a)
图8.2-1
8.2 哈密尔顿图
8.2.1 哈密尔顿图
定义8.2.1(1)经过图中所有顶点一次且仅一次的通 路,称为哈密尔顿通路;
v2
v3
(b)
8.1 欧拉图
8.1.2 欧拉图的判定
定理8.1.1 无向图是欧拉图,当且仅当是连通的,且中所有
顶点的度数都是偶( 数a ) 。
(b)
推论 无向连通图中存在欧拉回路,当且仅当中所有顶点 的度数都是偶数。
8.1 欧拉图
8.1.2 欧拉图的判定
定理8.1.2 无向图是半欧拉图,当且仅当是连通的,且只
1 10 1
在图8.1-5中,按当时确定的位置,读出的数为1101,鼓 轮按顺时针方向旋转一格,下一个读数为1010。
8.1 欧拉图
8.1.4 欧拉图的应用
欧拉图的应用,计算机旋转鼓轮的设计原理。
我们要设计成这样的旋转鼓轮表面,当 鼓轮旋转一周后,能够读出0000~1111 的16个不同的二进制数。
(完整版)离散数学实验指导书及其答案
实验一命题逻辑公式化简【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。
【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。
实验用例:用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过(表决开关亮)。
【实验原理和方法】(1)写出5人表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式。
(2)上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。
(3)输入5人表决值(0或1),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。
(4)输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。
参考代码:#include<stdio.h>int vote(int a,int b,int c,int d,int e){//五人中任取三人的不同的取法有10种。
i f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d || b&&c&&e || b&&d&&e || c&&d&&e)return 1;e lsereturn 0;}void main(){i nt a,b,c,d,e;p rintf("请输入第五个人的表决值(0或1,空格分开):");s canf("%d%d%d%d%d",&a,&b,&c,&d,&e);i f(vote(a,b,c,d,e))printf("很好,表决通过!\n");e lseprintf("遗憾,表决没有通过!\n");}//注:联结词不定义成函数,否则太繁实验二命题逻辑推理【实验目的】加深对命题逻辑推理方法的理解。
大学离散数学欧拉图和哈密尔顿图
(a)
(b)
推论1:哈密尔顿图无割点.
2020/9/28
24
计算机科学学院 刘芳
15.2.3 Hamilton图的判定方法
例3:
▪ 证明下述各图不是哈密顿图。
2020/9/28
25
计算机科学学院 刘芳
15.2.3 Hamilton图的判定方法
推论2:
▪ 对二部图G=< V1,V2,E>
若| V1 |≠| V2 |,则一定不是H图。 证明:
2020/9/28
14
计算机科学学院 刘芳
15.1.4 中国邮路问题
例如:
2020/9/28
15
计算机科学学院 刘芳
15.1.4 中国邮路问题
判断条件
▪ 定理:
▪ 设L是图G的包含所有边的回路,则L具有最小长 度的充分必要条件是: ▪ 每条边最多重复一次; ▪ G的每个回路上,所有重复边的长度之和,不 超过该回路长度的一半。
2020/9/28
16
计算机科学学院 刘芳
15.2 Hamilton 图
15.2.1 问题引入 15.2.2 Hamilton图的定义 15.2.3 Hamilton图的判定方法 15.2.4 应用举例
2020/9/28
17
计算机科学学院 刘芳
15.2.1 问题引入
周游世界问题(W.Hamilton, 1859年)
▪ 可以用结点表示城市,城市间的交通路线用边表示,而 城市间的交通线路距离可用附加于边的权表示。
▪ 这样,上述问题可以归结为寻找一条权的总和为最短的 哈密尔顿回路的问题。
2020/9/28
30
计算机科学学院 刘芳
分析
▪ 穷举法 ▪ 近似算法 ▪ …………
离散数学 欧拉图
18
这个问题是我国数学家管梅谷教授于 1960年首先提出解决的,所以国际上常 年首先提出解决的, 年首先提出解决的 称为中国邮路问题 称为中国邮路问题
19
如果邮递员所走街道的图形是一个欧拉图, 如果邮递员所走街道的图形是一个欧拉图, 则中国邮路问题可以理解为图中任何一条欧 拉回路都是最优回路。 拉回路都是最优回路。
16
欧拉回路问题既是一个有趣的游戏问题, 欧拉回路问题既是一个有趣的游戏问题 有趣的游戏问题 又是一个具有实用价值的问题。 又是一个具有实用价值的问题。 实用价值的问题 作为欧拉回路的应用, 作为欧拉回路的应用,邮递员送递信件时一般 的邮递路线是需要遍历某些特定的街道 遍历某些特定的街道, 的邮递路线是需要遍历某些特定的街道 理想 他应该走一条欧拉路, 地, 他应该走一条欧拉路 即不重复地走遍图中 的每一条边。 的每一条边。 一般邮递员感兴趣的是图中的边。 一般邮递员感兴趣的是图中的边。 感兴趣的是图中的边
如果图中有度数为奇数的顶点, 如果图中有度数为奇数的顶点,如图中各边上 的权为街道的长度。 的权为街道的长度。
20
图中有两个度数为奇数的顶点: 和 ,可以把构成B到 图中有两个度数为奇数的顶点:B和E,可以把构成 到 E的一条通路的各边都增加一条重复边(即平行边)。 的一条通路的各边都增加一条重复边(即平行边)。 的一条通路的各边都增加一条重复边
11
如图中, 为欧拉图; 为半欧拉图; 如图中 (1), (4)为欧拉图 (2), (5)为半欧拉图 为欧拉图 为半欧拉图 (3),(6)既不是欧拉图 也不是半欧拉图 既不是欧拉图, , 既不是欧拉图 也不是半欧拉图. 中各至少加几条边才能成为欧拉图? 在(3), (6)中各至少加几条边才能成为欧拉图 中各至少加几条边才能成为欧拉图
欧拉图-南京大学计算机科学与技术系
C
B
B
“一笔划”问题
?
欧拉通路和欧拉回路
定义:包含图(无向图或有向图)中每条边的简单通 路称为欧拉通路。
注意:欧拉通路是简单通路(边不重复),但顶点可重复
定义:包含图中每条边的简单回路称为欧拉回路。 如果图G中含欧拉回路,则G称为欧拉图。如果图G中 有欧拉通路,但没有欧拉回路,则G称为半欧拉图。 //备注:通常假设G是连通的。
若干小回路串成欧拉回路
若连通图G中所有的边包含在若干边不相交的简单回路中, 则G中含欧拉回路。 证明:对G中简单回路个数d施归纳法。当d=1时显然。
假设d≤k(k≥1)时结论成立。考虑d=k+1. 按某种方式对k+1个简单回路排序,令G‘=G-E(Ck+1),设G’ 中含s个连通分支,则每个非平凡分支所有的边包含在相互 没有公共边的简单回路中,且回路个数不大于k。由归纳假 设,每个非平凡连通分支Gi均为欧拉图,设其欧拉回路是 Ci'。因G连通,故Ck+1与诸Ci’都有公共点。 G中的欧拉回路构造如下:从Ck+1上任一点(设为v0)出发遍 历Ck+1上的边,每当遇到一个尚未遍历的Ci'与Ck+1的交点 (设为vi'), 则转而遍历Ci'上的边,回到vi'继续沿Ck+1进行。
Fleury算法的证明(续)
(2) (证明含所有边)假设Pm没有包括G中所有的边,令Gm中所 有非零度顶点集合为S(非空), 令S’=VG-S, 则vm∈S’。
考察序列e1,e2,…ej,ej+1,…,em。假设j是满足vj∈S, 而vj+1∈S’的最大下标。 如果没有这样的j, G就不连通,矛盾。因为Pm的终点在S’中,因此ej+1 一定是Gj中的割边。 令e是在Gj中与vj相关联的异于ej+1的边(非零度点一定有), 根据算法选择 ej+1(割边)的原则,e也一定是割边。但是,Gm中任意顶点的度数必是偶 数,e在Gm中的连通分支是欧拉图,e在Gm的某个 欧拉回路中,不可能是Gj的割边。矛盾。
离散数学 7-4 欧拉图和汉
二、汉密尔Leabharlann 图•与欧拉回路类似的是汉密尔顿回路。 •它是1859年汉密尔顿首先提出的一个关于12面体的 数学游戏:能否在图7-4.6中找到一个回路,使它含 有图中所有结点一次且仅一次? •若把每个结点看成一座城市,连接两个结点的边看 成是交通线,那么这个问题就变成能否找到一条旅 行路线,使得沿着该旅行路线经过每座城市恰好一 次,再回到原来的出发地?他把这个问题称为周游 世界问题。
v1
v2
v3
v4
v5
•为欧拉路,有从v2到v3的一笔画。 •为欧拉回路,可以从任一结点出发,一笔画回到原
出发点。
可以将欧拉路和欧拉回路的概念推广到有向图中。
5.定义7-4.2:给定有向图G,通过图中每边一次 且仅一次的一条单向路(回路),称作单向欧拉路 (回路)。
6.定理7-4.2 (1)有向图G为具有一条单向欧拉回 路,当且仅当G连通,并且每个结点的入度等于出度。 (2)有向图G有单向欧拉路,当且仅当G连通,并且恰 有两个结点的入度与出度不等,它们中一个的出度 比入度多1,另一个入度比出度多1。
证明思路与定理7-4.1类似
例1有向欧拉图应用示例:计算机鼓轮的设计。 鼓轮表面分成24=16等份,其中每一部分分别用绝 缘体或导体组成,绝缘体部分给出信号0,导体部分给 出信号1,在下图中阴影部分表示导体,空白体部分表 示绝缘体,根据鼓轮的位置,触点将得到信息4个触点 a,b,c,d读出1101(状态图中的边e13),转一角度后将读出 1010 (边e10)。 问鼓轮上16个部分怎样安排导体及绝缘体才能使鼓 轮每旋转一个部分,四个触点能得到一组不同的四位二 进制数信息。
第七章 1欧拉图
v5 e6 v6 e7
e3
v1
v3
v1 e1 v2 e2 v3 e4 v4 e5 v5 e6 v6
v6 e7
e3
v1
v3
v1 e1 v2 e2 v3 e4 v4 e5 v5 e6 v6 e7 v3
e3
v1
v3
v1 e1 v2 e2 v3 e4 v4 e5 v5
v1
e6 v6 e7 v3 e3 v1
7-1 欧拉图
v4
e4(此时不能选 e3, 因为 e3 是桥)
v5 e6 v6 e7
e5 e4 v3
e3 v1 e2 v2 e1
v4
路
v1 e1 v2 v1 e1 v2 e2 v3 v1 e1 v2 e2 v3 e4 v4
G
v5 e6 v6 e7
e5
e4 v3
v4
e3
v1
e2 v2 e1
v5 e6 v6 e7
e3
2021/1/13
11
7-1 欧拉图
运用上面的讨论,我们在G1中得到一个从b点出发 的一条闭迹 L1。这样我们就得到了一条更大的闭 迹,它是从a点出发沿L前进到达b,然后沿闭迹L1 回到b ,最后再沿L由b走到a。如果我们仍然没有 走遍整个图,那么我们再次把闭迹扩大,以此类 推,直到最后得到一个欧拉回路。
1)e0 不为桥,走到点 v1; 2)e0 必须为桥,走到点 v1 并删去点 v0。 3)L v0e0v1,v0=v1 ,重复 STEP 2。 STEP 3: 边集为空时,算法结束,输出 L。
2021/1/13
7-1 欧拉图
选择结点 v1
选择边
v2
e1
v3
e2(e2 为桥,删去边 e2 ,删去结点 v2)
离散数学结构 第15章 欧拉图与哈密顿图
第十五章欧拉图与哈密顿图15.1 欧拉图 (2)一、欧拉通路、欧拉回路、欧拉图、半欧拉图的定义 (3)二、判别定理 (4)三、求欧拉图中欧拉回路的算法 (6)1.Fleury算法,能不走桥就不走桥: (6)2.逐步插入回路法 (7)四、中国邮路问题 (8)练习题: (9)15.2哈密顿图 (11)一、哈密顿通路、哈密顿回路、哈密顿图、半哈密顿图的定义 (12)二、哈密顿图与半哈密顿图的一些必要与充分条件 (12)练习题 (18)15.3 带权图与货郎担问题 (24)一、带权图 (24)二、货郎担问题 (24)15.1 欧拉图主要内容:1. 欧拉通路、欧拉回路、欧拉图、半欧拉图的定义。
2. 判别定理。
3. 求欧拉图中欧拉回路的算法。
学习要求:1. 深刻理解欧拉通路与欧拉回路的定义以及它们的区别与联系。
2. 以无向欧拉图为例,进一步理解欧拉图的结构,即,欧拉图是若干个边不重的圈之并。
让我们先从两个例子出发,获得有关图的一些直观认识。
图论的研究起源于哥尼斯堡七桥问题。
哥尼斯堡城位于Pnsel河畔,河中有两个岛,有7座桥与4块陆地彼此相连,如上图所示。
居住于该城的居民想做这样的游戏:从4块陆地的任一块出发,经过每座桥一次且仅一次,最后返回原出发地。
当地的人们进行了许多次尝试,都没有成功。
后来,欧拉给出了问题的解。
首先欧拉将4块陆地表示成4个结点,凡陆地间有桥相连的,便在两点间连一条边,从而可将左图改画为右图如下:这样,哥尼斯堡七桥问题可描述为:能否有从A、B、C、D任一点出发,经过每条边一次且仅一次而返回出发点的回路欧拉证明了这样的回路是不存在的。
他的理由是,从图任一点出发,要回到原出发点,要求与每个点关联的边的数目为偶数,才能保证从一条边进入某点再从另一条边出去,一进一出才能回到原出发点。
而图中的顶点A、B、C和D均有奇数条边与其相关联,显然这样的回路是不存在的。
另一个例子是20世纪40年代的一个数学游戏。
离散数学实验实验六
一辆洒水车从所在的市政办点出发,需要在所有负责的街 道上洒水,并最后回到原点。问洒水车如何设计路线才能使 得走的路程最短。
问题分析
将这个问题抽象成图论的语言,就是给定一个连通图,每条 边的权值就是街道的长度,本问题转化为在图中求一条回路, 使得回路的总权值最小。
如果街道的连通图为欧拉图,则只要求出图中的一条欧拉回 路即可。否则,洒水车要完成任务就必须在某些街道上重复 走若干次。如果重复走一次,就加一条平行边,于是原来对 应的图形就变成了多重图。只是要求加进的平行边的总权值 最小就行了。于是,问题就转化为,在一个有奇度数结点的 赋权连通图中,增加一些平行边,使得新图不含奇度数结点, 并且增加的边的总权值最小。
编码:将复合命题转化成函数
示例 2)“A,E,F3人中有2人参加会议”
( A E F ) ( A E F ) ( A E F )
bool cond2(int a, int b, int c, int d, int e, int f) {
if( (!a && e && f) || (a && !e && f) || (a && e && !f) ) return true;
return false; }
求值:指定“去”或“不去”状态
数据结构: Int array[6] = {0, 0, 0, 0, 0, 0};
0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 1, 0 …… 1, 1, 1, 1, 1, 1
A,B,C,F参加,D,E不参加
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、欧拉图判定和应用
【实验内容】 判断一个图是不是,如果是,求出所有欧拉路
【实验原理和方法】
(1)用关系矩阵R=n n ij r )(表示图。
(2)对无向图而言,若所有结点的度都是偶数,则该图为欧拉图。
C 语言算法:
flag=1;
for(i=1;i<=n && flag;i++)
{
sum=0;
for(j=1;j<=n;j++)
if(r[i][j]) sum++;
if(sum%2==0) flag=0;
}
如果 flag 该无向图是欧拉图
(3)对有向图而言,若所有结点的入度等于出度,则该图为欧拉图。
C 语言算法:
flag=1;
for(i=1;i<=n && flag;i++)
{
sum1=0;
sum2=0;
for(j=1;j<=n;j++)
if(r[i][j]) sum1++;
for(j=1;j<=n;j++)
if(r[j][i]) sum2++;
if(sum1%2==0 || sum2%2==0) flag=0; }
如果 flag 该有向图是欧拉图
(4)求出欧拉路的方法:欧拉路经过每条边一次且仅一次。
可用回溯的方法求得所有欧拉路。
C 语言算法:
int count=0,cur=0,r[N][N]; // r[N][N]为图的邻接矩阵,cur 为当前结点编号,count 为欧拉路的数量。
int sequence[M];// sequence 保留访问点的序列,M 为图的边数
输入图信息;
void try1(int k) //k 表示边的序号
{
int i,pre=cur; //j保留前一个点的位置,pre为前一结点的编号
for (i=0;i<N;i++)
if (r[cur][i]) //当前第cur点到第i点连通
{
//删除当前点与第i点的边,记下第k次到达点i,把第i个点设为当前点
r[cur][i]=0;cur=sequence[k]=i;
if (k<M) try1(k+1); //试下一个点
else prt1();//经过了所有边,打印一个解
//上面条件不满足,说明当前点的出度为0,回溯,试下一位置
r[pre][i]=1;cur=pre;
}
}
2、最优二叉树的应用
【实验内容】最优二叉树在通信编码中的应用。
要求输入一组通信符号的使用频率,求各通信符号对应的前缀码。
【实验原理和方法】
(1)用一维数组f[N]存贮通信符号的使用频率,用求最优二叉树的方法求得每个通信符号的前缀码。
(2)用链表保存最优二叉树,输出前缀码时可用树的遍历方法。
#include <stdio.h>
#include <stdlib.h>
#define N 13
struct tree {
float num;
struct tree *Lnode;
struct tree *Rnode;
}* fp[N];//保存结点
char s[2*N];//放前缀码
void inite_node(float f[],int n)//生成叶子结点
{
int i;
struct tree *pt;
for(i=0;i<n;i++)
{
pt=(struct tree *)malloc(sizeof(struct tree));//生成叶子结点
pt->num=f[i];
pt->Lnode=NULL;pt->Rnode=NULL;
fp[i]=pt;
}
}
void sort(struct tree * array[],int n)//将第N-n个点插入到已排好序的序列中。
{
int i;
struct tree *temp;
for(i=N-n;i<N-1;i++)
if(array[i]->num>array[i+1]->num)
{
temp=array[i+1];
array[i+1]=array[i];
array[i]=temp;
}
}
struct tree * construct_tree(float f[],int n)//建立树
{
int i;
struct tree *pt;
for(i=1;i<N;i++)
{
pt=(struct tree *)malloc(sizeof(struct tree));//生成非叶子结点
pt->num=fp[i-1]->num+fp[i]->num;
pt->Lnode=fp[i-1];pt->Rnode=fp[i];
fp[i]=pt;//w1+w2
sort(fp,N-i);
}
return fp[N-1];
}
void preorder(struct tree *p,int k,char c)
{
int j;
if(p!=NULL)
{
if(c=='l') s[k]='0';
else s[k]='1';
if(p->Lnode==NULL) {//P指向叶子
printf("%.2f: ",p->num);
for(j=0;j<=k;j++)
printf("%c",s[j]);
putchar('\n');
}
preorder(p->Lnode,k+1,'l');
preorder(p->Rnode,k+1,'r');
}
}
void main(){
float f[N]={2,3,5,7,11,13,17,19,23,29,31,37,41};
struct tree *head;
inite_node(f,N); //初始化结点
head=construct_tree(f,N);//生成最优树
s[0]=0;
preorder(head,0,'l');//遍历树
}。