一笔画问题

一笔画问题

  如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。

  我们定义奇点是指跟这个点相连的边数目有奇数个的点。对于能够一笔画的图,我们有以下两个定理。

定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点。

定理2:存在欧拉回路的条件:图是连通的,有0个奇点。

两个定理的正确性是显而易见的,既然每条边都要经过一次,那么对于欧拉路,除了起点和终点外,每个点如果进入了一次,显然一定要出去一次,显然是偶点。对于欧拉回路,每个点进入和出去次数一定都是相等的,显然没有奇点。

一笔画性质:

■⒈凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为终点画完此图。

■⒉凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另一个奇点为终点。

■⒊其他情况的图都不能一笔画出。(奇点数除以二便可算出此图需几笔画成。)

  求欧拉路的算法很简单,使用深度优先遍历即可。

根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行DFS,时间复杂度为O(m+n),m为边数,n是点数。

l       以下是寻找一个图的欧拉路的算法实现:

l       样例输入:第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。

l           5 5

l           1 2

l           2 3

l           3 4

l           4 5

l           5 1

l       样例输出:欧拉路或欧拉回路

l           1 5 4 3 2 1

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int a[1000][1000];
 7 int du[1000];
 8 int sh;
 9 int n,m;
10 int tot=0;
11 int ans[1000];
12 int q,h;
13 void search(int A)
14 {
15     for(int j=1;j<=n;j++)
16      {
17          if(a[A][j]==1)
18           {
19               a[A][j]=0;
20               a[j][A]=0;
21             search(j);
22          }
23      }
24      //tot++;
25      ans[++tot]=A;
26 }
27 int main()
28 {
29     memset(a,0,sizeof(a));
30     cin>>n>>m;
31     for(int i=1;i<=m;i++)
32      {
33          cin>>q>>h;
34          a[q][h]=1;
35          a[h][q]=1;
36          du[h]++;
37          du[q]++;
38      }
39      sh=1;
40      for(int i=1;i<=n;i++)
41       {
42           if(du[i]%2==1)
43            {
44                sh=i;
45            }
46       }
47       search(sh);
48       for(int i=1;i<=tot;i++)
49        {
50            cout<<ans[i]<<" ";
51        }
52 }
时间: 2025-01-02 01:22:41

一笔画问题的相关文章

回路(一笔画问题)

回路(一笔画问题) 一.题目 回路 时间限制: 1 Sec  内存限制: 128 MB 提交: 0  解决: 0 [提交][状态][讨论版] 题目描述 给定一个由N行M列的'.'或者'*'的图形,'*'的格子无法路过,请使用一条回路去经过所有的'.'(必须回到起点,单点不算回路). 输入 第一行:N M(1 <= N <= 12, 1 <= M <= 12) 接下来N行,每行共有M个'.'或'*' 输出 一个正整数,表示满足条件的总条数,最后答案不会超过2^63 - 1. 样例输入

JAVA学习绘图颜色及其笔画属性设置字体显示文字

package com.graphics; import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date; import javax.swing.*; /** * * @author biexiansheng * */ public class DrawString extends JFrame{ private Shape rect;//矩形对象 private Font font;//字体对象 priva

nyoj42 一笔画问题

题目链接 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度 4.有

一个Brushes笔画应用ios源码完整版

效果很不错的画笔App,提供几十种不同的画笔,包括毛笔画笔.拥有绘画App的一些基本功能,包括颜色选择.绘画保存,支持撤销(undo).重做(redo)以及橡皮擦功能等等,甚至还支持类似PhotoShop图层(layer)的功能(如第二张效果图).说明:应用的App Store地址:https://itunes.apple.com/app/id545366251.效果图: <ignore_js_op> <ignore_js_op> <ignore_js_op> <

NYOJ 42 一笔画

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

Nyoj42 一笔画问题 (欧拉道路)

http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring> #define CLR(arr) memset(arr,0,sizeof(arr)) #define P 1001 int G[P],fa[P]; int find(int x){return x==fa[x]?x:x=find(fa[x]);} int main() {     int n,a,b

hdoj 3018 Ant Trip(无向图欧拉路||一笔画+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 思路分析:题目可以看做一笔画问题,求最少画多少笔可以把所有的边画一次并且只画一次: 首先可以求出该无向图中连通图的个数,在每个无向连通图中求出需要画的笔数再相加即为所求.在一个无向连通图中,如果所有的点的度数为偶数则存在一个欧拉回路, 则只需要画一笔即可:如果图中存在度数为奇数的点,则需要画的笔数为度数为奇数的点的个数 /2:需要注意的孤立的点不需要画: 代码如下: #include <cst

一笔画问题x(www我会了好开心!!这次是有向图~)

考试的方面: (1)一笔画是怎样画的(水) (2)能否实现一笔画(小技巧) 1)必须连通(有向与无向都必须满足) 2)有向图:(欧拉回路)如果出度等于入度,可以从任意点搜索: (欧拉路)如果入度大于出度,则一定为终止点,而如果出度大于入度,则一定为开始的点(注意,如果入度与出度之间的差值大于一,则一定不能够形成欧拉路) 3)无向图:所有点的度数都为偶数时,才能实现欧拉回路||有两个点为奇数,且这两个点分别为起止点 一笔画性质: ■⒈凡是由偶点组成的连通图,一定可以一笔画成.画时可以把任一偶点为起

例题4.2 好看的一笔画 LA3263

1.题目描述:点击打开链接 2.解题思路:本题利用欧拉定理解决,设顶点数,边数,面数分别是V,E,F,则V+F-E=2.因此,F=E+2-V.我们只需要求解E和V的个数即可.V的个数:除了题目中输入的点,还有两两线段相交得到的新点,由于可能出现三线共点的情况,因此最后对于顶点还要使用一下unique函数去重.对于E的个数,首先是输入的n条边(因为是一笔画构成,那么n个点会连出n条边),接下来是去重后的顶点集中,由于一个顶点在一条线段上而产生的新的边,此时我们可以枚举每一个顶点,再枚举每一条线段,