咱们来玩一笔画游戏吧,规则是这样的:有一个连通的图,能否找到一个恰好包含了所有的边,并且没有重复的路径。
输入包含多组数据。每组数据的第一行包含两个整数n和m (2≤n, m≤1000),其中n是顶点的个数,m是边的条数。紧接着有m行,每行包含两个整数from和to (1 ≤ from, to ≤ n, from != to),分别代表边的两端顶点。边是双向的,并且两个顶点之间可能不止一条边。
对应每一组输入,如果能一笔画则输出“Yes”;否则输出“No”。
3 3
1 2
2 3
1 3
4 7
1 2
2 1
1 3
1 4
1 4
2 3
4 3
Yes
No
题目要求一个连通的有向图是否可以一笔画完。这是一个可行遍性问题,即从图中一个顶点出发不重复地遍历完所有的边并回到起始顶点,这种回路是欧拉回路。在解答该问题前先对欧拉回路相关的内容进行介绍。
无向图:
1) 设G 是连通无向图,则称经过G 的每条边一次并且仅一次的路径为欧拉通路;
2) 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为欧拉回路(Euler circuit);
3) 具有欧拉回路的无向图G 称为欧拉图(Euler graph)。
有向图:
1) 设D是有向图,D的基图连通,则称经过D的每条边一次并且仅一次的有向路径为有向欧拉通路;
2) 如果有向欧拉通路是有向回路,则称此有向回路为有向欧拉回路(directed Euler circuit);
3) 具有有向欧拉回路的有向图D称为有向欧拉图(directed Euler graph)。
图1是有向图。
图1 有向图和无向图
欧拉通路和欧拉回路的判定是很简单的,请看下面的定理及推论。
定理2.1 无向图G存在欧拉通路的充要条件是:
G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。
推论2.1:
1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。
2) 当G是无奇度结点的连通图时,G必有欧拉回路。
3) G为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度结点的连通图。
例如图1(a)所示的无向图,存在两个奇度顶点v2和v5,所以存在欧拉通路,且欧拉通路必以这两个顶点为起始顶点和终止顶点;该无向图不存在欧拉回路。图2-1(b)所示的无向图为欧拉图。
定理2.2 有向图D存在欧拉通路的充要条件是:
D为有向图,D的基图连通,并且所有顶点的出度与入度都相等;或者除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度与入度之差为1,另一个顶点的出度与入度之差为-1。
推论2.2:
1) 当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
2) 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路。
3) 有向图D为有向欧拉图的充分必要条件是D的基图为连通图,并且所有顶点的出、入度都相等。
例如图1(c)所示的有向图,顶点v2和v4入度和出度均为1;顶点v1的出度为2、入度为1,二者差值为1;顶点v3的出度为1、入度为2,二者相差为-1;所以该有向图只存在有向欧拉通路,且必须以顶点v1为始点,以顶点v3为终点。图1(d)所示的有向图不存在有向欧拉通路。
首先根据输入构造图的邻接矩阵,通过邻接矩阵判断图是否连通,不连通说明不可以一笔画完,如果连通,再判断图是否有奇度顶点,有就不能一笔画完,没有就说明可以一笔画完。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Author: 王俊超
* Time: 2016-05-12 09:04
* CSDN: http://blog.csdn.net/derrantcm
* Github: https://github.com/Wang-Jun-Chao
* Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data3.txt"));
while (scanner.hasNext()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
// 记录边
int[] edge = new int[m * 2];
for (int i = 0; i < edge.length; i++) {
edge[i] = scanner.nextInt();
}
if (draw(n, edge)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
scanner.close();
}
/**
* 图是否可以笔画完(判断无向图是否存在欧拉通路)
*
* @param n 顶点点个数,顶点的编号从1到n
* @param edge 边的连接数组,两个一起表示一条边
* @return true:可以一笔画完,false:不可以一笔画完
*/
private static boolean draw(int n, int[] edge) {
int[] vertex = new int[n + 1];
// 统计每个顶点的度数
for (int i : edge) {
vertex[i]++;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。
///////////////////////////////////////////////////////////////////////////////////////////
// 统计奇度顶点个数
int count = 0;
for (int i = 1; i < vertex.length; i++) {
if (vertex[i] % 2 != 0) {
count++;
}
}
// 奇度顶点不为0且不为2说明不存在欧拉通路
if (count != 0 && count != 2) {
return false;
}
// 构造边的邻接矩阵
int[][] graph = new int[n + 1][n + 1];
for (int i = 0; i < edge.length; i += 2) {
int v = edge[i];
int w = edge[i + 1];
graph[v][w]++;
graph[w][v]++;
}
// 清空顶号入度标记,将它作为访问标记使用,0表示没有访问过,1表示访问过
for (int i = 0; i < vertex.length; i++) {
vertex[0] = 0;
}
List<Integer> list = new ArrayList<>(n);
// 有向图连通,那么从任意一个顶点都可以访问到其它的顶点
// 从第一个顶点开始访问,进行广度优先遍历
vertex[1] = 1;
list.add(1);
while (!list.isEmpty()) {
int v = list.remove(0);
for (int i = 1; i <= n; i++) {
// 边(v, i),t为0说明v不能直接到i
int t = graph[v][i];
// 如果(v, i)可达,且顶点i没有被访问过,就标记已经访问过,添加到访问队列中
if (t != 0 && vertex[i] == 0) {
vertex[i] = 1;
list.add(i);
}
}
}
for (int i = 1; i < vertex.length; i++) {
// 还有顶点没有访问到,说明图不连通
if (vertex[i] == 0) {
return false;
}
}
return true;
}
}
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法