初學演算法之最基礎的歐拉迴路

來源:互聯網
上載者:User

標籤:偶數   display   return   blank   using   i++   上傳   view   ret   

須知:

圖中的度:所謂頂點的度(degree),就是指和該頂點相關聯的邊數。

在有向圖中,度又分為入度和出度。 入度 (in-degree) :以某頂點為弧頭,終止於該頂點的弧的數目稱為該頂點的入度。 出度 (out-degree) 是指以某頂點為弧尾,起始於該頂點的弧的數目。 在某頂點的入度和出度的和稱為該頂點的度 定義:歐拉迴路:每條邊恰好只走一次,並能回到出發點的路徑
歐拉路徑:經過每一條邊一次,但是不要求回到起始點 歐拉迴路存在性的判定:

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

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

歐拉路徑存在性的判定:

一。無向圖
一個無向圖存在歐拉路徑,若且唯若   該圖所有頂點的度數為偶數   或者  除了兩個度數為奇數外其餘的全是偶數。

二。有向圖
一個有向圖存在歐拉路徑,若且唯若 該圖所有頂點的度數為零     或者 一個頂點的度數為1,另一個度數為-1,其他頂點的度數為0。

例:NYOJ 42 一筆畫問題

一筆畫問題時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 
描述

zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫一個程式,判斷一個圖是否能夠用一筆畫下來。

規定,所有的邊都只能畫一次,不能重複畫。

 

 
輸入
第一行只有一個正整數N(N<=10)表示測試資料的組數。
每組測試資料的第一行有兩個正整數P,Q(P<=1000,Q<=2000),分別表示這個畫中有多少個頂點和多少條連線。(點的編號從1到P)
隨後的Q行,每行有兩個正整數A,B(0<A,B<P),表示編號為A和B的兩點之間有連線。
輸出
如果存在合格連線,則輸出"Yes",
如果不存在合格連線,輸出"No"。
範例輸入
24 31 21 31 44 51 22 31 31 43 4
範例輸出
NoYes
來源
[張雲聰]原創
上傳者
張雲聰
 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const int Max = 1111; 5 int map[Max][Max]; 6 int vis[Max],coun[Max]; 7 int n,p,q,f; 8 void dfs(int a) 9 {10     vis[a]=1;11     for(int i=1;i<=p;i++)12     {13         if(map[a][i])14         {15             coun[a]++;   //每個頂點的度數 16             if(!vis[i])17             dfs(i);18         }19     }20 }21 int main()22 {23     scanf("%d",&n);24     while(n--)25     {26         f=0;27         memset(coun,0,sizeof(coun));28         memset(map,0,sizeof(map));29         memset(vis,0,sizeof(vis));30         int a,b;31         scanf("%d %d",&p,&q);32         for(int i=0;i<q;i++)33         {34             scanf("%d %d",&a,&b);35             map[a][b]=1;36             map[b][a]=1;37         }38         dfs(1);39         for(int k=1;k<=p;k++)40         if(!vis[k])41         {42             f=1;43             break;44         }45         if(f)46         printf("No\n");47         else48         {49             int j=0;50             for(int k=1;k<=p;k++)51             {52                 if(coun[k]%2!=0)     //記錄度數為奇數的個數 53                 j+=1;54             }55                 if(j==2||j==0)   //如果度數為奇數的為兩個,則這倆個是起點和終點 56                 printf("Yes\n"); //如果度數為奇數的為0個,則所有點可為起點 57                 else58                 printf("No\n");59         }60     }61     return 0;62 }
View Code

 

 

 

初學演算法之最基礎的歐拉迴路

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.