离散数学的实验

实验要求

  1. 给定一非负整数序列(例如:(4,2,2,2,2))。
  2. 判断此非负整数序列是否是可图化的,是否是可简单图化的。
  3. 如果是可简单图化的,根据Havel定理过程求出对应的简单图,并输出此简单图的相邻矩阵(默认第i行对应顶点vi)。
  4. 判断此简单图是否是连通的。
  5. 如果是连通图,判断此图是否是欧拉图。如果是欧拉图,请输出一条欧拉回路(输出形式如:v2->v1->v5->v3->v4->v5->v2)。

难度不太大,但是好多同学没有学过图的数据结构,邻接表 ,邻接矩阵啥的,所以这个地方把代码放上来供大家学习
说一下基本思路吧

基本流程
图化直接用定理度数列之和为偶数(握手定理)
简单图用Havel定理判断顺便建表
连通图我刚开始用的并查集,但是并查集判断是否联通之后就废了,但是后面发现找欧拉回路时要用dfs判断连通块中点的数量,所以后面索性改成dfs判断连通了(应该早点把全局思路打开了再写代码了,浪费了一点点时间)
然后是否是欧拉图判断一下度数列是否都是偶数就行
找欧拉回路用fleury算法,找的时候判断边是否是桥的话用dfs判断一下连通块中点的数量

Java代码放上

class Node implements Comparable<Node> {int degree;int idx;int pre;public Node(int x,int y,int z){this.idx=x;this.degree=y;this.pre=z;}@Overridepublic int compareTo(Node o) {return Integer.compare(o.degree,this.degree);}
}public class Exp {static int N=110;static int M=1010;static int n;static int father;static int edgeIdx=0;static Map<Integer,List<Node>> map=new HashMap<>();static int[][] Matrix=new int[N][N];static Node[] nodes=new Node[N];static Node[] nodeCopy=new Node[N];static int[][] edge=new int[N][M];public static void main(String[] args) throws IOException {BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));String[] param=reader.readLine().split(" ");n= param.length;for(int i=0;i<param.length;i++)//初始化度数列{nodes[i]=new Node(i,Integer.parseInt(param[i]),i);}for(int i=0;i<n;i++){nodeCopy[i]=new Node(nodes[i].idx,nodes[i].degree,i);}if(!isGraph(nodes))System.err.println("不可图化QAQ");else{System.out.println("可图化");if(isSimple(nodes)){System.out.println("可简单图化");showMatrix();if(isConnect()){System.out.println("该图为连通图");if(isEur()){System.out.println("是欧拉图哦!");System.out.println("输出欧拉回路");Fleury(0);}else{System.out.println("不是欧拉图哦!");}}else{System.out.println("不是连通图哦QAQ");}}else{System.out.println("不可简单图化");}}}static void Fleury(int x)//找欧拉回路{for(int i=0;i<edgeIdx;i++){if(Matrix[x][i]==1) {int nextIdx = i;if (isNextEdge(x, nextIdx)) {System.out.print(x + "->" + nextIdx + " ");removeEdge(x, nextIdx);Fleury(nextIdx);}}}System.out.println();return;}static void removeEdge(int x,int y)//删边{Matrix[x][y]=Matrix[y][x]=0;}static void addEdge(int x,int y){Matrix[x][y]=Matrix[y][x]=1;}static boolean isNextEdge(int x,int y)//判断是否是桥{int countEdge=0;for(int i=0;i<edgeIdx;i++){if(Matrix[y][i]==1){countEdge++;}}if(countEdge>0)return true;else{boolean[][] visited=new boolean[n][edgeIdx];int count1=dfs(x,visited);removeEdge(x,y);visited=new boolean[n][edgeIdx];int count2=dfs(x,visited);if(count1-count2==0)return true;elsereturn false;}}static int dfs(int x,boolean[][] v)//搜索点所在连通块中点的数量{int count=0;for(int i=0;i<edgeIdx;i++){if(Matrix[x][i]==1&&Matrix[i][x]==1&&!v[x][i]&&!v[i][x]){v[x][i]= v[i][x]=true;count++;count+=dfs(i,v);}}return count;}static boolean isEur()//判断是否是欧拉图{for(int i=0;i<n;i++){if(nodeCopy[i].degree%2!=0)return false;}return true;}static void showMatrix()//打印相邻矩阵{for(int i=0;i<n;i++) {for (int j = 0; j < n; j++) {System.out.print(Matrix[i][j] + " ");}System.out.println();}}static boolean isSimple(Node[] a)//判断是否可简单图化{if(a[0].degree>n)return false;else{return Havel();}}static boolean Havel()//用Havel搞一个简单图{int l=0;int r=n-1;int count=0;Arrays.sort(nodes,count,n);nodes[0].pre=nodes[0].idx;father=nodes[0].pre;while(count<n){Arrays.sort(nodes,count,n);Node start=nodes[count];l=count;if(start.degree==0)break;for(int size=nodes[l].degree;l<(count+size);){l++;if(l>=n)return false;else {int idx=nodes[l].idx;nodes[l].pre = start.idx;nodes[l].degree--;if (addList(idx)) {map.get(idx).add(start);Matrix[idx][start.idx] = 1;edge[idx][edgeIdx]=1;edge[start.idx][edgeIdx]=1;edgeIdx++;}if (addList(start.idx)) {map.get(start.idx).add(nodes[l]);Matrix[start.idx][idx] = 1;}}}count++;}if(!checkSimple(nodes)) {System.err.println("不可简单图化");return false;}else{return true;}}static boolean isConnect()//判断是否连通{boolean[][] visited=new boolean[n][edgeIdx];int count1=dfs(0,visited);for(int i=1;i<n;i++){visited=new boolean[n][edgeIdx];int count=dfs(i,visited);if(count!=count1)return false;}return true;}static int find(int a)//并查集的find后面改了没有用到{if(nodes[a].pre!=nodes[a].idx){nodes[a].pre=find(nodes[a].pre);}return nodes[a].pre;}static boolean addList(int a)//建领接表,其实没有用到,后面换成邻接矩阵了{if(map.get(a)!=null)return true;else{List<Node> list=new ArrayList<Node>();map.put(a,list);return true;}}static boolean checkSimple(Node[] a)//是否简单 {for(int i=0;i<n;i++){if(a[i].degree<0)return false;}return true;}static boolean isGraph(Node[] a)//是否可图化 {int s=sum(a);if(s%2==0)return true;elsereturn false;}static int sum(Node[] a)//求度数列和{int s=0;for(int i=0;i<n;i++){s+=a[i].degree;}return s;}
}

离散数学实验-01 可简单图化,连通图和欧拉图的判断(利用Fleury算法输出欧拉回路)相关推荐

  1. 离散数学实验----中国邮递员问题

    实验目的和要求 实验目的: 理解什么是欧拉图,熟悉欧拉路和欧拉回路的概念. 掌握Dijkstra算法,求解最短路径 掌握Fleury算法,求解欧拉回路. 了解Edmonds-Johnson算法解决中国 ...

  2. 离散数学实验报告 实验3 欧拉路的确定

    离散数学实验报告 实验3 欧拉路的确定 一.实验目的 理解欧拉图的概念,掌握欧拉通/回路的判定方法. 二.实验内容 输入一个无向简单图的邻接矩阵,判定该图是否含有欧拉通/回路.若有,请给出一条欧拉通/ ...

  3. 离散数学实验题目-图

    离散数学实验报告 计算机科学与技术系 目录 第一章 实验概述 3 1.1 实验目的 3 1.2 实验内容 3 1.3 实验环境 3 第二章 实验原理和实现过程 4 2.1 实验原理 4 2.2 实验过 ...

  4. 离散数学实验报告四——图的应用

    离散数学实验报告四--图的应用 预习内容: 1.图的基本概念 1.1图的定义:现实世界中许多现象能用某种图形表示,这种图形是由一些点和一些连接两点间的连线所组成. 1.2邻接点: 同一条边的两个端点. ...

  5. 离散数学实验三则(关系元算,集合运算与操作,最短路)

    前言 前段时间才做了离散实验的实验报告,为防止在本地遗失,所以上传到CSDN上一份,欢迎大家一起学习 实验1 关系元算 实验报告内容 一.实验目的 熟悉掌握命题逻辑中的联结词.真值表.主范式等,进一步 ...

  6. 离散数学实验2 关联矩阵、相邻矩阵、生成树、环路空间、断集空间的求解 C++

    离散数学实验报告2 文章目录 离散数学实验报告2 一.实验题目 二.实验目的 三.实验要求 四.实验步骤和内容 需求分析: 输入形式与输入范围 概要设计: 使用的数据结构与算法: 程序流程: 详细代码 ...

  7. C语言求幺元的函数,离散数学实验指导书及其答案.doc

    实验一 命题逻辑公式化简 [实验目的]加深对五个基本联结词(否定.合取.析取.条件.双条件)的理解.掌握利用基本等价公式化简公式的方法. [实验内容]用化简命题逻辑公式的方法设计一个表决开关电路. 实 ...

  8. 离散数学范式c语言实验报告,离散数学实验报告-利用真值表法求主析取范式及主合取范式的实现...

    1.实 验 报 告( / 学年 第 一 学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称利 ...

  9. 可简单图化算法(Havel算法)

    算法分析(推理过程) 首先,我们很容易通过握手定理(所以点的度数加起来是偶数)知道,对应的度序列是否可图化. 在确定了可图化之后.但是担心会出现不可简单图化的情况. 我们只需要对于这种可能进行讨论就好 ...

最新文章

  1. 如何在电脑桌面添加计算机网络等,如何实现在电脑桌面上添加文字提醒
  2. requests抓取以及Xpath解析
  3. iScroll.js 用法参考 (share)
  4. python编程入门p-Python编程_基础入门
  5. Golang的协程(goroutine)和同步机制
  6. 科大星云诗社动态20201227
  7. 学术联赛 | 运用知识图谱技术,赋能多领域应用 ——“未来杯”AI学术联赛总决赛暨颁奖典礼圆满落幕...
  8. python脚本式编程_Python编程入门(一)
  9. 复杂电路简化经典例题_一天搞定考试系列之电路原理(3)
  10. First of all, let’s talk about the richest man in Japan
  11. 我怎么感觉js快无敌了~
  12. vs.net已经检测到制定的WEB服务器运行的不是ASP.NET1.1版,你无法运行ASP.NET WEB应用程序或服务...
  13. 【C/C++】在Dosbox安装和体验Turbo C++ 3.0
  14. 未来10年35项最值得你期待的技术(中)
  15. Quorum工作原理
  16. yxc_第二章 数据结构(一)_kmp算法
  17. 词向量转换回文本-以CMU-MOSI为例
  18. 用python画皮卡丘的代码-用python画一只可爱的皮卡丘
  19. A Simple Math Problem题目翻译
  20. poj 1830 开关问题

热门文章

  1. JAVA实验四:写一个彩票的模拟程序
  2. C语言小游戏之五子棋
  3. 虚拟机可以多开一台服务器吗,游戏多开必备:虚拟机vmware安装
  4. open-falcon API 访问
  5. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第一章 概念和工具(二)
  6. Delphi 如何调用 OpenCV?
  7. 关于百度快照问题的若干说明
  8. 百度网站抓取诊断自动提交工具
  9. C语言实例二(switch——case用法)
  10. 韩顺平Java自学笔记 反射