zoukankan      html  css  js  c++  java
  • 七桥问题--欧拉(算法竞赛入门经典)

    一 七桥问题的结论:

    如果一个图是连通(无向图)的,且最多只有两个奇点(奇点数目为0或者2)则一定存在欧拉回路。如果有两个奇点,则必须从其中一个奇点出发,另一个奇点终止;如果奇点不存在,则可以在任意点出发,最终一定会回到该点。(路径不能重复)

    如果图是有向图,最多只能有两个点的入度不等于出度,而且必须是其中一个点的出度恰好比入度大1(作为起点),另一个点的入度比出度大1(作为终点)。当然必须注意前提条件,那就是图必须连通。

    下面贴上ac代码:

     1 #include<iostream>
     2 #include<string.h>
     3 using namespace std;
     4 #define maxn 1000
     5 int g[maxn][maxn],vis[maxn][maxn],n,m;
     6 void uler(int u)
     7 {
     8     for(int v=0;v<n;v++)
     9     if(g[u][v]&&!vis[u][v])
    10     {
    11         vis[u][v]=vis[v][u]=1;//无向图如此处理,有向图只需要把它改成vis[u][v]=1就行了
    12         uler(v);//类似dfs,如果到这里为止,他所有的邻接点都已经被访问。
    13         cout<<u<<' '<<v<<endl;
    14     }
    15 }
    16 int main()
    17 {
    18     cin>>n>>m;
    19     memset(g,0,sizeof(g));
    20     int u,v;
    21     for(int i=0;i<m;i++)
    22     {
    23         cin>>u>>v;
    24         g[u][v]=g[v][u]=1;
    25     }
    26     uler(1);
    27     return 0;
    28 
    29 }

    本代码中输出的路径是按照逆向输出的,因此要输出正向的路径,需要引入栈,把(u,v)压入栈,然后输出。

    本题我自己建立了一个样例:

    这是本题的原图,我们建立如下的图表存储边的关系

     

    0

    1

    2

    0

    0

    1

    1

    1

    1

    0

    1

    2

    1

    1

    0

    下面我们看看本题程序执行结果:

    由结果可见我们的路径输出是逆序的。

  • 相关阅读:
    python_网络编程struct模块解决黏包问题
    python_网络编程socket(UDP)
    python_网络编程socket(TCP)
    python_面向对象
    python_生成器
    python_迭代器
    linux实操_shell自定义函数
    linux实操_shell系统函数
    linux实操_shell读取控制台输入
    scrapy-redis 0.6.8 配置信息
  • 原文地址:https://www.cnblogs.com/khbcsu/p/3864955.html
Copyright © 2011-2022 走看看