• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Way of C++

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              55 Posts :: 0 Stories :: 19 Comments :: 0 Trackbacks

            公告

            The first time i use this blog, i will write something that i learn which i think is worth write down.

            常用鏈接

            留言簿(3)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            判斷一個圖中是否存在歐拉回路(每條邊恰好只走一次,并能回到出發點的路徑),在以下三種情況中有三種不同的算法:

            一、無向圖
            每個頂點的度數都是偶數,則存在歐拉回路。

            二、有向圖(所有邊都是單向的)
            每個節頂點的入度都等于出度,則存在歐拉回路。

            以上兩種情況都很好理解。其原理就是每個頂點都要能進去多少次就能出來多少次。

            三、混合圖(有的邊是單向的,有的邊是無向的。常被用于比喻城市里的交通網絡,有的路是單行道,有的路是雙行道。)
            找到一個給每條無向的邊定向的策略,使得每個頂點的入度等于出度,這樣就能轉換成上面第二種情況。這就可以轉化成一個二部圖最大匹配問題。網絡模型如下:

            1. 新建一個圖。
            2. 對于原圖中每一條無向邊i,在新圖中建一個頂點e(i);
            3. 對于原圖中每一個頂點j,在新圖中建一個頂點v(j)。
            4. 如果在原圖中,頂點j和k之間有一條無向邊i,那么在新圖中從e(i)出發,添加兩條邊,分別連向v(j)和v(k),容量都是1。
            5. 在新圖中,從源點向所有e(i)都連一條容量為1的邊。
            6. 對于原圖中每一個頂點j,它原本都有一個入度in、出度out和無向度un。顯然我們的目的是要把所有無向度都變成入度或出度,從而使它的入度等于總度數的一半,也就是(in + out + un) / 2(顯然與此同時出度也是總度數的一半,如果總度數是偶數的話)。當然,如果in已經大于總度數的一半,或者總度數是奇數,那么歐拉回路肯定不存大。如果in小于總度數的一半,并且總度數是偶數,那么我們在新圖中從v(j)到匯點連一條邊,容量就是(in + out + un) / 2 – in,也就是原圖中頂點j還需要多少入度。

            按照這個網絡模型算出一個最大流,如果每條從v(j)到匯點的邊都達到滿流量的話,那么歐拉回路成立。

            這個算法可以用在ZJU#1992(http://acm.zju.edu.cn/show_problem.php?pid=1992


            弗羅萊(Fleury)算法求歐拉回路

            算法輪廓:
            (1)任取v0∈V(G),令P0=v0.
            (2)設Pi=v0e1v1e2…eivi已經行遍,按下面方法來從E(G)-{e1,e2,…,ei}中選取ei+1:
            (a)ei+1與vi相關聯;
            (b)除非無別的邊可供行遍,否則ei+1不應該為Gi=G-{e1,e2,…,ei}中的
            (3)當(2)不能再進行時,算法停止。

            可以證明,當算法停止時所得簡單回路Pm=v0e1v1e2…emvm(vm=v0)為G中一條歐拉回路。
            程序文件夾:33333

            //輸入一個無向圖,先判斷是否存在歐拉路,若有求出一條歐拉路


            /先輸入頂點數和邊數,之后輸入每條邊連接的2個點


            //例如


            //5 6     (5個點,6條邊)


            //1 2


            //1 3


            //2 3


            //2 5


            //2 4


            //4 5

             1#include <stdio.h>
             2#include <string.h>
             3
             4
             5struct stack
             6{int top , node[210];} f; //頂點的堆棧
             7
             8int a[201][201]; //圖的鄰接矩陣
             9
            10int n;
            11
            12void dfs(int x)       //圖的深度優先遍歷
            13{
            14int i;
            15
            16f.top ++; f.node[f.top] = x;
            17
            18for (i = 1; i <= n; i ++)
            19
            20          if (a[i][x] > 0)
            21          {
            22              a[i][x] = 0; a[x][i] = 0;     //刪除此邊
            23
            24              dfs(i);
            25
            26              break;
            27          }

            28}

            29
            30void Euler(int x)     //歐拉路算法
            31{
            32int i , b;
            33
            34f.top = 0; f.node[f.top] = x;     //入棧
            35
            36while (f.top >= 0)
            37{
            38          b = 0;
            39
            40          for (i = 1; i <= n; i ++
            41    if (a[f.node[f.top]][i] > 0
            42    {b = 1break;}
            43
            44          if (b == 0)       //如果沒有點可以擴展,輸出并出棧
            45          {
            46              printf("%d " , f.node[f.top]);
            47
            48              f.top --;
            49          }

            50          else {f.top --; dfs(f.node[f.top+1]);}        //如果有,就DFS
            51      }

            52}

            53
            54int main()
            55{
            56
            57int m , s , t , num , i , j , start;
            58
            59      //input
            60
            61      scanf("%d %d" , &n , &m); //n頂點數    m邊數
            62
            63      memset(a , 0 , sizeof(a));
            64
            65      for (i = 0; i < m; i ++)
            66      {
            67          scanf("%d %d" , &s , &t);
            68          a[s][t] = 1; a[t][s] = 1;
            69      }

            70
            71
            72      //判斷是否存在歐拉回路
            73
            74      s = 0; start = 1;
            75
            76      for (i = 1; i <= n; i ++)
            77      {
            78          num = 0;
            79
            80          for (j = 1; j <= n; j ++)
            81              num += a[i][j];
            82
            83          if (num % 2 == 1
            84{start = i; s ++;}
            85      }

            86
            87      if ((s == 0|| (s == 2)) 
            88Euler(start);
            89      else printf("No Euler path\n");
            90
            91      getchar(); getchar();
            92      return 0;
            93}

            94

            posted on 2007-12-21 19:36 koson 閱讀(1413) 評論(3)  編輯 收藏 引用 所屬分類: DataStruct And Algorithm

            Feedback

            # re: Euler Circle Problem 2008-06-04 09:47 colorain
            仔細看了代碼,一個Euler()和dfs()就搞定了這個程序,很厲害啊!

            不過有一點不懂,就是算法中并沒有判斷是否是“橋”,那么是依據什么呢?

            似乎很簡單的操作,我就是不知道它是如何 遵循 Fleury算法啊!??
              回復  更多評論
              

            # re: Euler Circle Problem 2008-06-04 09:57 colorain
            另外歐拉回路問題,在網上搜索了一下,似乎沒什么叫 “Euler Circle”的
            很多都叫Euler circuits,其他的還有Euler trial,Euler path等  回復  更多評論
              

            # re: Euler Circle Problem 2008-06-09 14:20 清水
            我也是同感,怎么會不判斷橋就搞定了。高!  回復  更多評論
              

            久久丝袜精品中文字幕| 国产精品久久久久天天影视| 伊人久久精品影院| 青青热久久国产久精品 | 久久免费美女视频| 九九久久精品无码专区| 97视频久久久| 久久国产精品久久国产精品| 理论片午午伦夜理片久久 | 久久本道综合久久伊人| 国内精品久久久久久久久电影网| av国内精品久久久久影院| 青青久久精品国产免费看| 久久久久综合网久久| 亚洲中文字幕伊人久久无码| 九九99精品久久久久久| 狠狠色婷婷久久综合频道日韩| 国产成人香蕉久久久久| 日韩久久久久久中文人妻| 久久久久亚洲AV无码专区桃色 | 久久中文字幕视频、最近更新| 久久综合狠狠综合久久综合88| 久久久WWW成人免费精品| 狠狠色丁香久久婷婷综合五月| 欧美一区二区久久精品| 人妻少妇精品久久| 亚洲国产精品久久| 久久精品成人免费网站| 久久夜色精品国产噜噜噜亚洲AV| 久久久精品久久久久影院| 久久er国产精品免费观看8| 精品久久久久久久| 国产麻豆精品久久一二三| 久久久女人与动物群交毛片| 亚洲成色WWW久久网站| 久久国产免费观看精品3| 亚洲午夜久久久久久久久电影网| 久久毛片免费看一区二区三区| 精品欧美一区二区三区久久久| 久久国产亚洲精品麻豆| 国产精品成人无码久久久久久|