尤拉迴路解決一筆畫問題

2021-07-11 15:32:24 字數 1522 閱讀 9553

一筆畫問題

時間限制:

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

【分析】

一筆畫問題是乙個運用搜尋和尤拉迴路才能做出來的題目,如果光用搜尋能        做出來,但是會遠遠的超時,所以不能單單使用搜尋來做,其實搜尋很多題目都是    要通過剪枝來避免超時的,尤拉迴路就是專門解決一筆畫問題的。

【**】

#include#include#define inf 0x3f3f3f3f

int e[1010][1010],q,p,flag;

void dfs(int cur,int s)

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

}return ;

}int main()

,tmp;

flag=0,x=0;

scanf("%d %d",&p,&q);

int i,j,a,b;

memset(e,0,sizeof(e));

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

for(j=1;j<=p;j++)

if(i==j) e[i][j]=0;

else e[i][j]=inf;

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

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

}if(x>2)

// 如果出來奇數的個數大於2個說明沒有結果,他們只有乙個入口沒有出口,所以超過2個肯定畫不完

if(x==2||x==1)

dfs(tmp,0); // 如果有2個或1個出現一次的,只可能從乙個開始從另乙個結束,不然不可能畫完

else

dfs(1,0); // 如果都是出現次數大於1,就相當於乙個環,從哪開始都一樣

if(flag==0)

printf("no\n");

}return 0;

}

尤拉迴路判定演算法 一筆畫問題

如果圖中的一條路經經過每條邊一次,則該路徑稱為尤拉路徑。如果該路徑正好是乙個迴路,即從起點出發又回到起點,則該路徑稱為尤拉迴路。如果乙個圖有尤拉迴路,則該圖稱為尤拉圖。無向圖存在尤拉迴路的充要條件 乙個無向圖存在尤拉迴路,當且僅當該圖所有頂點度數都為偶數,且該圖是連通圖。無向圖存在尤拉路徑的充要條件...

一筆畫問題 尤拉迴路 半尤拉迴路 並查集

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

nyoj42一筆畫問題(尤拉迴路)

題目解析 此題是尤拉迴路,尤拉迴路滿足的條件 無論是有向圖還是無向圖前提條件都是圖要連通,如果是無向圖需要有0個奇度頂點或者2個奇度頂點,如果是有向圖,在前兩個條件的基礎之上還要附加上乙個條件 乙個奇度頂點入度比出度大1,另乙個奇度頂點出度比入度大1。所以要解決這樣的問題,首先要判斷圖的連通性,在圖...