精华内容
下载资源
问答
  • 欧拉图欧拉路

    千次阅读 2012-08-07 11:39:04
    具有欧拉回路的图称作欧拉图。 定理:无向图G具有一条欧拉路,当且仅当G连通的,且有零个或两个奇数度结点。欧拉路和欧拉回路的概念,很易推广到有向图中去。 有向欧拉图 定义:给定有向图G,通过...
    定义:给定无孤立结点图G,若存在一条路,经过图中海边一次且仅一次,该条路称为欧拉路;若存在一条回路,经过图中海边一次且仅一次,该回路称为欧拉回路。具有欧拉回路的图称作欧拉图。


    定理:无向图G具有一条欧拉路,当且仅当G是连通的,且有零个或两个奇数度结点。欧拉路和欧拉回路的概念,很易推广到有向图中去。


    有向欧拉图


    定义:给定有向图G,通过图中每边一次且仅一次的一条单向路(回路),称作单向欧拉路(回路)。


    定理:有向图G具有一条单向欧拉回路,当且仅当是连通的,且每个结点入度等于出度。一个有向图G具有单向欧拉路,当且仅当它是连通的,而且除两个结点外,每个结点的入度等于出度,但这两个结点中,一个结点的入度比出度大1,另一个结点的入度比出度小1。


    找欧拉路(或回路)可以用Euler算法,如下:
    (1)寻找从i出发的环p1p2…px(p1=px=i)。
    (2)标记顶的p1->x为待查的状态。
    (3)对所有处在待查状态的节点pj递归调用过程Euler(pj)


    将Euler(pj)找到的环q1q2…qx插入到环p1p2…px中,得到回路p1p2…pjq1…qypj+1…px。时间复杂度为O(m)。


    void Euler(int t)
    {
       int i;
       for(i=edge[t].next;i!=-1;i=edge[i].next)
       if(edge[i].t==-1)
       {
           edge[i].t=1;
           Eluer(edge[i].v);
           pop[top++]=edge[i].index;
       }
    }
    



    输出时只要逆序输出pop即可,而且当边是按字母序建边时,输出的也是按字母序的答案。


    纯dfs算法实现Euler()正确性的证明:


    假设节点s为起点,则深搜到不能搜的时候那个节点就是s。为什么呢,只要将这点想通,基本就没什么问题了。我们知道如果一个节点入度减1,那么它的出度必然要减1,在以s为起点的路径中,se1v1e2v2....eivi,如果vi节点不是s节点且为深搜的最后节点,也就是说vi没有了出度,然而我们知道对于v1...v(i-1)节点入度一但减少,出度也就减少了,然而对于s起点来说只要出度减少却没有入度减少,vi的入度减少却没有了出度,所以证明vi节点不可能会成为不是s节点且为深搜的最后节点,即除非他还不是深搜的最后节点,到这里我们基本就可以确定了,vi要满足深搜最后节点必然为vi==s,这样的话vi的入度减少了,出度也减少了(因为s出度减少了),s的出度减少了,入度也减少了(因为vi的入度减少了)所以可以证明以s为起点的深搜最后节点也为s。


    然后就是返回了,当沿着路径返回的途中如果vi节点还有出度的话,那么就以vi为起点开始深搜,根据上面的证明,我们可以知道最后的深搜节点肯定为vi起点了。


    将回路se1v1e2v2.....eivi(ei1vi1ei2vi2...eiivi)e(i+1).....ejs,括号里面的就是返回途中发生的又一次回路咯,把它嵌入到里面自然大的回路也满足要求了。


    欧拉路时同理。
    展开全文
  • Description 在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。 能否走过这样的七座桥,并且每桥只走一...具有欧拉回路的图叫做欧拉图。 你的任务:对于给定的一组无向图数据,判断其是否成

    Description

    在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。

    能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理。对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。人们又通常把一笔画成回到出发点的欧拉路叫做欧拉回路。具有欧拉回路的图叫做欧拉图。
    你的任务是:对于给定的一组无向图数据,判断其是否成其为欧拉图?

    Input

    连续T组数据输入,每组数据第一行给出两个正整数,分别表示结点数目N(1 < N <= 1000)和边数M;随后M行对应M条边,每行给出两个正整数,分别表示该边连通的两个结点的编号,结点从1~N编号。

    Output

    若为欧拉图输出1,否则输出0。

    Sample

    Input

    1
    6 10
    1 2
    2 3
    3 1
    4 5
    5 6
    6 4
    1 4
    1 6
    3 4
    3 6
    

    Output

    1
    

    Hint

    如果无向图连通并且所有结点的度都是偶数,则存在欧拉回路,否则不存在。

    注意:

    1.记得清空数组
    2.记得判断图是否连通
    

    答案:

    #include <iostream>
    #include<bits/stdc++.h>
    #define ll long long
    #define INF 0x3f3f3f3f
    const int N = 1111;
    using namespace std;
    
    int mp[N][N];  //无向图
    int dp[N];     //记录度
    bool vis[N];   //标记数组
    
    int cnt;
    
    void DFS(int pos,int n)  //DFS判断是否连通
    {
        vis[pos]=1;
        cnt++;
        int i;
        for(i=1;i<=n;i++)
        {
            if(!vis[i]&&mp[pos][i])
            {
                DFS(i,n);
            }
        }
    
    }
    
    int main()
    {
        ios::sync_with_stdio(0);
        int t;
        cin>>t;
        while(t--)
        {
            memset(mp,0,sizeof(mp));  //清空数组
            memset(dp,0,sizeof(dp));
            memset(vis,0,sizeof(vis));
            int n,m;
            cin>>n>>m;
            int x,y;
            while(m--)
            {
                cin>>x>>y;
                mp[x][y]=mp[y][x]=1;  //构建无向图
                dp[x]++;  //记录x的度
                dp[y]++;  //记录y的度
            }
            int i;
            cnt=0;
            DFS(1,n);  //判断是否连通
            int flag=0;
            for(i=1; i<=n; i++)
            {
                if(dp[i]%2)
                {
                    flag=1;
                    break;
                }
            }
            if(!flag&&cnt==n)
                cout<<1<<endl;
            else
                cout<<0<<endl;
        }
        return 0;
    }
    
    
    展开全文
  • 欧拉路欧拉图

    千次阅读 2012-05-21 20:42:42
    一:如何判断G具有一条欧拉路? 对于无向而言,当且仅当G是连通,且有零个或者两个奇度顶点。经典题一笔画问题。 二:怎样判断G是欧拉图? 对于无向,当且仅当G是连通,并且每个顶点都是偶度顶。...

    一:如何判断图G具有一条欧拉路?

    对于无向图而言,当且仅当图G是连通图,且有零个或者两个奇度顶点。经典题一笔画问题。

    二:怎样判断图G是欧拉图?

    对于无向图,当且仅当图G是连通的,并且每个顶点都是偶度顶。

    对于有向图,当且仅当G是连通的且每个顶点的出度等于入度。

    证明方法请查阅离散数学。

    展开全文
  • 欧拉路和欧拉回路

    2019-09-26 09:28:05
    欧拉路径的定义: 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。 如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)...定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点...

    欧拉路径的定义:

    如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
    如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
    具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。

    欧拉路径以及欧拉回路的判断:

    奇点的定义:指跟这个点相连的边数目有奇数个的点。
    定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点。
    定理2:存在欧拉回路的条件:图是连通的,有0个奇点。

    为了更形象的了解这两个定理,请看下图:
    在这里插入图片描述

    这是一条欧拉路径,有且只有2个奇点,这里1和4是奇点,因为只有一条边和他们相连

    在这里插入图片描述

    这是一条欧拉回路,从起点开始最后还能回到起点,没有奇点,因为1,2,3,4没有一个点是奇数条边与它相连

    欧拉路和欧拉回路的题目往往都会与深度优先搜索(DFS)关联,一笔画问题是欧拉路中的一道典型例题

    一笔画问题

    Description

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

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

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

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

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

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

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

    Input

    第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。保证是一个连通的简单图,即两点之间没有多重边。1<=n, m<=1000。

    Output

    输出一个路径,按照字典序的最小序输出,用一个空格隔开,构成欧拉通路或欧拉回路。数据保证一定有通路或回路。

    Sample Input 1

    5 5
    1 2
    2 3
    3 4
    4 5
    5 1

    Sample Output 1

    1 2 3 4 5 1

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 1e4+5;
    int mp[maxn][maxn];
    int d[maxn];		//记录每个点的度
    int n,m;
    
    vector<int>path;
    
    void dfs(int x)		//深搜找路径
    {
    	for(int i = 1 ; i <= n ; i++)
    	{
    		if(mp[x][i])
    		{
    			mp[x][i] = mp[i][x] = 0;
    			dfs(i);		
    		}	
    	}
    	path.push_back(x);
    }
    
    
    int main()
    {
    	cin >> n >> m;
    	for(int i = 1 ; i <= m ; i++)
    	{
    		int x,y;
    		cin >> x >> y;
    		mp[x][y] = mp[y][x] = 1;	//把可以连通的点标记为1
    		d[x]++;
    		d[y]++;
    	}
    	int st = 1;
    	for(int i = 1 ; i <= n ; i++)
    	{
    		if(d[i] % 2 != 0)	//因为题目已经说过一定存在欧拉路或者欧拉回路所以只要找到一个奇点即可
    		{
    			st = i;
    			break;
    		}
    	}
    	dfs(st);
    	int len = path.size();
    	cout << path[len - 1];
    	for(int i = len - 2 ; i >= 0 ; i--)//倒叙输出路径,因为在DFS中存路径实际上是一个递归的过程
    	{
    		cout << " " << path[i] ;
    	}
    	return 0;
    } 
    
    展开全文
  • 概念 ...具有欧拉路径但不具有欧拉回路的图称为半欧拉图。 判断是否为欧拉(回) 以下判断基于此图的基图连通。 1.无向图存在欧拉回路的充要条件 一个无向图存在欧拉回路,当且仅当该图所有...
  • 欧拉路&欧拉回路

    2018-03-03 18:01:00
    具有欧拉路径但不具有欧拉回路的图称为半欧拉图。 2.欧拉回路数学家欧拉在研究著名的德国哥尼斯(Koenigsberg)七桥问题时发现的. 3.以下判断基于此图的基图连通。 在所有边连通的情况下 如果所有的点的度数都为...
  • 欧拉路与欧拉回路

    2019-10-05 11:04:50
    具有欧拉回路的图称为欧拉图,不是柏拉图。 定理:无向图G具有一条欧拉路,当且仅当G连通的,且有0个或者两个奇数度得结点。 推论:无向图G具有一条欧拉回路,当且仅当G连通的,并且所有结点的度数均为偶数...
  • 欧拉图

    2017-02-12 02:37:11
    通过有向图或者无向图中所有边且每边只通过一次的称为欧拉通路,相应的回路称为欧拉回路,具有欧拉回路的图称为欧拉图具有欧拉通路的图称为半欧拉图 一个图如何使欧拉图呢,首先判断它连通的,然后判断每个点...
  • 欧拉回路与欧拉路

    2013-03-30 18:40:44
    具有欧拉回路的图称为欧拉图,不是柏拉图。 定理:无向图G具有一条欧拉路,当且仅当G连通的,且有0个或者两个奇数度得结点。 推论:无向图G具有一条欧拉回路,当且仅当G连通的,并且所有结点的度数均为...
  • 欧拉路 欧拉回路 定理及算法

    千次阅读 2018-10-15 19:05:05
    具有欧拉回路的图称为欧拉图。 2、定理:无向图G具有一条欧拉路,当且仅当G连通的,且有0个或者两个奇数度的结点。 3、推论:无向图G具有一条欧拉回路,当且仅当G连通的,并且所有结点的度数均为偶数。 ...
  • 具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 无向图:图连通,只有两个顶点奇数度,其余都偶数度的。 ...
  • 欧拉路

    千次阅读 2012-05-12 10:20:03
    欧拉路: 如果给定无孤立结点G,若存在一...一、 对于无向G,具有一条欧拉路,当且仅当G连通,且有零个或两个奇数度结点。 且有零个奇数度结点,存在欧拉回路;有两个奇数度结点,存在欧拉路。 判断无向G
  • POJ 2513 欧拉路

    2015-05-14 11:08:00
    //今天下午,学一道欧拉,一道哈密尔顿。...具有欧拉回路的图成为欧拉图。 //判断欧拉路是否存在的方法 //有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 //无向图:图连通,
  • 图论学习之欧拉路

    2015-08-23 15:15:14
    具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 无向图:图连通,只有两个顶点奇数度,其余都偶数度...
  • poj1386判欧拉路

    千次阅读 2012-08-10 15:30:10
    具有欧拉回路的图成为欧拉图。   判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 无向图:图连通,只有两个顶点奇数度,其余都...
  • 欧拉回路

    千次阅读 2018-10-20 16:41:50
    具有欧拉回路的图称为欧拉图(简称ë图),具有欧拉路径但不具有欧拉回路的图称为半欧拉图 欧拉定理 1)欧拉路:通过图中所有边的简单路 2)欧拉回路:闭合的欧拉路 3)欧拉图:包含欧拉回路的图 无向图存在...
  • 首先我们来百度一下,欧拉路径以及...具有欧拉路径但不具有欧拉回路的图称为半欧拉图。 通俗来说,就是欧拉路径就是图中的每条边经过却只经过一次的路径,而最后回到起点的路径就是欧拉回路。 那给你一个图怎么...
  • 欧拉回路判断

    2016-06-29 22:35:35
    具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 无向图:图连通,只有两个顶点奇数度,其余都
  • 欧拉路: 如果给定无孤立结点G,若...一、 对于无向G,具有一条欧拉路,当且仅当G连通,且有零个或两个奇数度结点。 且有零个奇数度结点,存在欧拉回路;有两个奇数度结点,存在欧拉路。 判断无向G...
  • 具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。 无向图:图连通,只有两个顶点奇数度,其余都偶数度的。 判断...
  • 计算欧拉路,如果欧拉路存在,就数组欧拉路上的边的编号;...具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都出度=入度。
  • 具有欧拉回路的图称作欧拉图。 相关定理及推论: 1.无向图G具有一条欧拉路,当且仅当G连通的,且有零个或两个奇数度结点。 2.无向图G具有一条欧拉回路,当且仅当G连通的,并且所有结点的度数全为偶数。 3.有向图...
  • 一、 实验目的和要求 内容: 编程随机生成n个结点无向图并能进行(半)... 程序能够根据输入n和m,随机生成具有n个结点m个边简单无向图(能够判断n和m合理性),然后判断图连通性,如果这个图是个连通图

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

具有欧拉路的图是欧拉图