標籤:偶數 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
初學演算法之最基礎的歐拉迴路