一筆畫問題
時間限制:
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
noyes
【分析】
一筆畫問題是乙個運用搜尋和尤拉迴路才能做出來的題目,如果光用搜尋能 做出來,但是會遠遠的超時,所以不能單單使用搜尋來做,其實搜尋很多題目都是 要通過剪枝來避免超時的,尤拉迴路就是專門解決一筆畫問題的。
【**】
#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。所以要解決這樣的問題,首先要判斷圖的連通性,在圖...