描述
判斷乙個圖是否能夠用一筆畫下來.規定,所有的邊都只能畫一次,不能重複畫。
輸入第一行只有乙個正整數n(n<=10)表示測試資料的組數。
每組測試資料的第一行有兩個正整數p,q(p<=1000,q<=2000),分別表示這個畫中有多少個頂點和多少條連線。(點的編號從1到p)
隨後的q行,每行有兩個正整數a,b(0
輸出如果存在符合條件的連線,則輸出"yes",
如果不存在符合條件的連線,輸出"no"。
樣例輸入
24 3
1 21 3
1 44 5
1 22 3
1 31 4
3 4樣例輸出
noyes
思路:1.先判斷圖是否為連通圖,不連通則一筆無法畫出。
2.若為連通圖,根據尤拉迴路判斷即可。
1、基本概念:
(1)定義
尤拉通路 (尤拉跡)—通過圖中每條邊一次且僅一次,並且過每一頂點的通路。
尤拉迴路 (尤拉閉跡)—通過圖中每條邊一次且僅一次,並且過每一頂點的迴路。
尤拉圖—存在尤拉迴路的圖。尤拉圖就是從一頂出發每條邊恰通過一次又能回到出發頂點的那種圖,即不重複的行遍所有的邊再回到出發點。
通路和迴路-稱vie1e2…envj為一條從 vi到 vj且長度為n的通路,其中長度是指通路中邊的條數.稱起點和終點相同的通路為一條迴路。
簡單圖-不含平行邊和自迴路的圖。
混合圖-既有有向邊,也有無向邊的圖
平凡圖-僅有乙個結點的圖
完全圖-有n個結點的且每對結點都有邊相連的無向簡單圖,稱為無向完全圖;有n個結點的且每對結點之間都有兩條方向相反的邊相連的有向簡單圖為有向完全圖。
(2)尤拉圖的特徵:
無向圖a)g有尤拉通路的充分必要條件為:g 連通,g中只有兩個奇度頂點(它們分別是尤拉通路的兩個端點)。
b)g有尤拉迴路(g為尤拉圖):g連通,g中均為偶度頂點。
有向圖a)d有尤拉通路:d連通,除兩個頂點外,其餘頂點的入度均等於出度,這兩個特殊的頂點中,乙個頂點的入度比出度大1,另乙個頂點的入度比出度小1。
b)d有尤拉迴路(d為尤拉圖):d連通,d中所有頂點的入度等於出度。乙個有向圖是尤拉圖,當且僅當該圖所有頂點度數都是0。
**如下:
#include#include#include#include#include#includeusing namespace std;
int pre[1010];
int unionsearch(int root) //查詢根結點
return root;
}void join(int root1, int root2) //連通則合併
int main()
for(int i = 2; i <= v; ++i)
if(unionsearch(1) != unionsearch(i)) //判斷是否為連通圖
if(!flag) //非連通圖
printf("no\n");
else //連通圖
}}
其中unionsearch可以使用遞迴得出
int unionsearch(int root) //查詢根結點
另一種思路:
#include#include#include#includeusing namespace std;
#define maxn 1010
int pre[maxn]; //父節點
bool flag[maxn]; //頂點的奇偶性(很巧妙)
int find(int root) //查詢根結點+路徑壓縮
void join(int root1, int root2) //合併
int main()
for(int i = 1; i <= v; ++i)
if(sum_root > 1)
else
}return 0;
}
一筆畫問題
一筆畫問題是在6x6的棋盤上分布著若干點,從紅色起點開始依次不重複地經過每個白色點,已經經過的點可以跨越過去。程式採用深度搜尋,從紅色點開始分別往上 往下 往左和往右邁出第一步,然後沿著當前方向,分別探測左邊 前面和右邊的下一結點,標記已經經過的節點為空。探測到左邊有節點就左轉,然後直行到該節點 如...
一筆畫問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入 第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一...
一筆畫問題
描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入 第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一行有兩個正整數p,q p 1000,q 2000 分別表示這個畫中...