求歐拉回路的一種解法
下面是無(wú)向圖的歐拉回路輸出代碼:注意輸出的前提是已經(jīng)判斷圖確實(shí)是歐拉回路。
int num = 0;//標(biāo)記輸出隊(duì)列
int match[MAX];//標(biāo)志節(jié)點(diǎn)的度,無(wú)向圖,不區(qū)分入度和出度
void solve(int x)
{
if(match[x] == 0)
Record[num++] = x;
else
{
for(int k =1;k<=n;k++)
{
if(Array[x][k] !=0 )
{
Array[x][k]--;
Array[k][x]--;
match[x]--;
match[k]--;
solve(k);
}
}
Record[num++] = x;
}
}
注意record中的點(diǎn)的排列是輸出的到序,因此,如果要輸出歐拉路徑,需要將record倒過(guò)來(lái)輸出。
求歐拉回路的思路:
循環(huán)的找到出發(fā)點(diǎn)。從某個(gè)節(jié)點(diǎn)開(kāi)始,然后查出一個(gè)從這個(gè)出發(fā)回到這個(gè)點(diǎn)的環(huán)路徑。這種方法保證每個(gè)邊都被遍歷。如果有某個(gè)點(diǎn)的邊沒(méi)有被遍歷就讓這個(gè)點(diǎn)為起點(diǎn),這條邊為起始邊,把它和當(dāng)前的環(huán)銜接上。這樣直至所有的邊都被遍歷。這樣,整個(gè)圖就被連接到一起了。
具體步驟:
1。如果此時(shí)與該點(diǎn)無(wú)相連的點(diǎn),那么就加入路徑中
2。如果該點(diǎn)有相連的點(diǎn),那馬就列一張表,遍歷這些點(diǎn),知道沒(méi)有相連的點(diǎn)。
3。處理當(dāng)前的點(diǎn),刪除走過(guò)的這條邊,并在其相鄰的點(diǎn)上進(jìn)行同樣的操作,并把刪除的點(diǎn)加入到路徑中去。
4。這個(gè)其實(shí)是個(gè)遞歸過(guò)程。