nyoj 42一筆畫問題

2021-09-06 16:06:12 字數 2662 閱讀 9211

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4

描述

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

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

第一行只有乙個正整數n(n<=10)表示測試資料的組數。

每組測試資料的第一行有兩個正整數p,q(p<=1000,q<=2000),分別表示這個畫中有多少個頂點和多少條連線。(點的編號從1到p)

隨後的q行,每行有兩個正整數a,b(0輸出

如果存在符合條件的連線,則輸出"yes",

如果不存在符合條件的連線,輸出"no"。

樣例輸入

2

4 31 2

1 31 4

4 51 2

2 31 3

1 43 4

樣例輸出

no

yes

**

[張云聰]原創

做這道題之前,我們先引入乙個列題........

在18世紀的哥尼斯堡城裡有七座橋。當時 有很多人想要一次走遍七座橋,並且每座橋只能經過一次。這就是世界上很有名的哥尼斯堡七橋問題。你能一次走遍這七座橋,而又不重複嗎?(自己動手畫畫吧)

答案

16.一筆畫問題

這個問題,實際上是一筆畫問題。

一筆畫就是一筆可以畫成乙個圖。

判斷一筆畫的方法:

①是連通的。乙個圖,如果圖上任意二點總有線段連線著,就稱為連通的。不是連通的就不能一筆畫出。

②奇點個數是0或者是2。圖上線段的端點可以分成二類,奇點和偶數。乙個點,以它為端點的線段數是奇數就稱為奇點,線段數是偶數就稱為偶點。

乙個圖是否是一筆畫就看奇點的個數,奇點個數是 0 或者 2,就是一筆畫,否則就不是一筆畫。

哥尼斯橋問題,就是一筆畫問題。但因a、b、c、d四個點都是奇點即奇點的個數是4,而不是0或2,所以不是一筆畫,也就不能一次走遍,而又不重複。

針對這麼個情況,所謂的連通圖:

若無向圖g是平凡圖或者g中任意兩點都是連通的,則稱g是連通圖,否則稱g是非連通圖。

關於弱連通圖和強連通圖:

弱連通圖的概念是:如果略去d中各有向邊的方向後所得無向圖是連通圖,則稱d是弱連通圖。

反之 若d中任何一對頂點都是互相可達的,則稱d是強連通圖。

所以這個問題完全可以轉化策略為:

第一步: 首先我們不管它三七二十幾,先進行連通性的判斷。

第二步:

(1)如果是連通的,我們來判斷此圖的度的奇點的個數是0或者是2 ,如果是,則說明這個是尤拉圖,即可以一筆畫出,反之則不能一筆畫出

(2)如果是非連通的,這說明這個圖很定不能一筆畫出。

**為:

採用dfs演算法求解:

1

/*nyoj 42 coder gxjun*/2

/*一筆畫問題

*/3 #include4 #include

5 #include6

#define maxn 1005

7int edge[maxn]; //度8

bool

vis[maxn],map[maxn][maxn];

9int

pp , qq ;

10void dfs( int

pos )

1117

18int

main()

1936 dfs(1

);37 flag=true;38

for(i=1;i<=pp ;i++)43}

44if

(flag)

4554

else

55 puts("no"

);56}57

return0;

58 }

view code

採用並查集求解

**:

1

/*並查集 @coder gxjun*/2

/*一筆畫問題

*/3 #include4 #include

5 #include6

#define maxn 1001

7int

rank[maxn],father[maxn];

8int

edge[maxn];

9int

pp,qq;

10void

init()15}

16int set_find(int

a)22

//帶狀態壓縮的並查集

23void set_union(int x,int

y)31

else35}

36}3738

intmain()

3953

for(i=1;i<=pp;i++)

54if(rank[i]==pp) break;55

if(i<=pp)

5663

else puts("no"

);64}65

return0;

66 }

view code

NYOJ 42 一筆畫問題

快有乙個禮拜沒寫過部落格了,資料結構裡面的演算法太多,經典題目就那麼點,做一道少一道,因為自己學,所以花了很多時間來理解。不扯了。思路 簡單的尤拉迴路,判斷是否能夠一筆畫就在於各個點是否連通,判斷是否連通可以用並查集來做。而且節點為奇點個數為0或者為2才能一筆畫。include includeint...

NYOJ 42 一筆畫問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入 第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一...

NYOJ 42 一筆畫問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一行...