求歐拉回路的一種解法
  下面是無(wú)向圖的歐拉回路輸出代碼:注意輸出的前提是已經(jīng)判斷圖確實(shí)是歐拉回路。
  int num = 0;//標(biāo)記輸出隊(duì)列
  int match[MAX];//標(biāo)志節(jié)點(diǎn)的度,無(wú)向圖,不區(qū)分入度和出度
  void solve(int x)
  {
       if(match[x] == 0)
              Record[num++] = x;
       else
      {
             for(int k =1;k<=n;k++)
             {
                       if(Array[x][k] !=0 )
                    {
                                  Array[x][k]--;
                                  Array[k][x]--;
                                  match[x]--;
                                  match[k]--;
                                  solve(k);
                     }
              }
             Record[num++] = x;
      }
    }
  注意record中的點(diǎn)的排列是輸出的到序,因此,如果要輸出歐拉路徑,需要將record倒過(guò)來(lái)輸出。
  求歐拉回路的思路:
  循環(huán)的找到出發(fā)點(diǎn)。從某個(gè)節(jié)點(diǎn)開(kāi)始,然后查出一個(gè)從這個(gè)出發(fā)回到這個(gè)點(diǎn)的環(huán)路徑。這種方法保證每個(gè)邊都被遍歷。如果有某個(gè)點(diǎn)的邊沒(méi)有被遍歷就讓這個(gè)點(diǎn)為起點(diǎn),這條邊為起始邊,把它和當(dāng)前的環(huán)銜接上。這樣直至所有的邊都被遍歷。這樣,整個(gè)圖就被連接到一起了。
  具體步驟:
  1。如果此時(shí)與該點(diǎn)無(wú)相連的點(diǎn),那么就加入路徑中
  2。如果該點(diǎn)有相連的點(diǎn),那馬就列一張表,遍歷這些點(diǎn),知道沒(méi)有相連的點(diǎn)。
  3。處理當(dāng)前的點(diǎn),刪除走過(guò)的這條邊,并在其相鄰的點(diǎn)上進(jìn)行同樣的操作,并把刪除的點(diǎn)加入到路徑中去。
  4。這個(gè)其實(shí)是個(gè)遞歸過(guò)程。