當前位置:首頁 » 操作系統 » 歐拉圖演算法

歐拉圖演算法

發布時間: 2022-12-27 22:46:15

① 求演算法:歐拉路

歐拉迴路 【定義】
圖G的一個迴路,若它恰通過G中每條邊一次,則稱該迴路為歐拉(Euler)迴路。
具有歐拉迴路的圖稱為歐拉圖(簡稱E圖)。
【相關結論】
定理:
一個無向圖是歐拉圖,當且僅當該圖所有頂點度數都是偶數。
一個有向圖是歐拉圖,當且僅當該圖所有頂點度數都是0。
求歐拉迴路的一種解法
下面是無向圖的歐拉迴路輸出代碼:注意輸出的前提是已經判斷圖確實是歐拉迴路。
int num = 0;//標記輸出隊列
int match[MAX];//標志節點的度,無向圖,不區分入度和出度
void solve(int x)
l{
l if(match[x] == 0)
l
l Record[num++] = x;
l
l else
l {
l for(int k =0;k<=500;k++)
l {
l if(Array[x][k] !=0 )
l {
l Array[x][k]--;
l Array[k][x]--;
l match[x]--;
l match[k]--;
l solve(k);
l }
l
l }
l Record[num++] = x;
l }
l}
注意record中的點的排列是輸出的到序,因此,如果要輸出歐拉路徑,需要將record倒過來輸出。
求歐拉迴路的思路:
循環的找到出發點。從某個節點開始,然後查出一個從這個出發回到這個點的環路徑。這種方法保證每個邊都被遍歷。如果有某個點的邊沒有被遍歷就讓這個點為起點,這條邊為起始邊,把它和當前的環銜接上。這樣直至所有的邊都被遍歷。這樣,整個圖就被連接到一起了。
具體步驟:
1。如果此時與該點無相連的點,那麼就加入路徑中
2。如果該點有相連的點,那麼就列一張表,遍歷這些點,直到沒有相連的點。
3。處理當前的點,刪除走過的這條邊,並在其相鄰的點上進行同樣的操作,並把刪除的點加入到路徑中去。
4。這個其實是個遞歸過程。

--以上為網路的內容

② 圖論中,求歐拉路徑的演算法有哪些

首先要根據歐拉路徑的存在條件來判斷一個圖是否存在歐拉路徑,判斷條件為如下3條
對於一個無向圖,如果它每個點的度都是偶數,那麼它存在一條歐拉迴路;
如果有且僅有2個點的度為奇數,那麼它存在一條歐拉路;
如果超過2個點的度為奇數,那麼它就不存在歐拉路了。
然後可以用Fleury演算法求歐拉路徑,可以參照
http://www.cnblogs.com/Lyush/archive/2013/04/22/3036659.html

③ 求大神回答,用C語言實現離散數學中的Fleury演算法,最後結果要求1、判斷是否為歐拉圖;2、輸出歐拉迴路

#include "SqStack.h" //
堆棧的常見操作

#include "Queue.h"//
隊列的常見操作

typedef int Graph[200][200];
int v,e;

void DFS(Graph &G
,SqStack &S,int x,int t)
{

int k=0,i,m,a;

Push(S,x);

for(i=t;i<v;i++)

if(G[i][x]>0)

{

k=1;

G[i][x]=0; //
刪除此邊

G[x][i]=0;

DFS(G
,S,i,0);

break;

}//if,for

if(k==0)

{

Pop(S);

GetTop(S,m);

G[x][m]=1;

G[m][x]=1;

a=x+1;

if(StackLength(S)!=e)

{
Pop(S);

DFS(G
,S,m,a);

}//if

else

Push(S,x);

}//if
}//DFS

int BFSTest(Graph G)
{

int a[200],x,i,k=0;

LinkQueue Q;

InitQueue(Q);

EnQueue(Q,0);

for(i=0;i<v;i++)

a[i]=0;

a[0]=1;

while(!QueueEmpty(Q))

{

DeQueue(Q,x);

for(i=0;i<v;i++)

if(G[x][i]>0)

if(a[i]!=1)

{

a[i]=1;

EnQueue(Q,i);

}//if

}//while

for(i=0;i<v;i++)

if(a[i]==0)

{

k=1;

break;

}

if(k==1)

return 0;

else

return 1;
}

void Euler(Graph &G
,int x)

{

int m;

SqStack S;

InitStack(S);

DFS(G
,S,x,0);

printf("
該圖的一個歐拉迴路為:
");

while(!StackEmpty(S))

{

GetTop(S,m);

printf("->v%d",m);

Pop(S);

}//while
}

void InputM1(Graph &G)
{

int h,z;
printf("Please input
頂點數和邊數
\n");
scanf("%d",&v);
scanf("%d",&e);
for(int i=0;i<v;i++)

for(int j=0;j<v;j++)

G[i][j]=0;

printf("please int the
鄰接矩陣的值
(
起點
(
數字
)
終點
(
數字
))

\n");
for(int i=0;i<e;i++)

{

scanf("%d",&h);

scanf("%d",&z);

G[h-1][z-1]=1;

G[z-1][h-1]=1;

}//for
}//InputM1
int main()
{

int i,j,sum,k=0;

Graph G;

InputM1(G);

if(BFSTest(G)==0)

{

printf("
該圖不是連通圖
!\n");

exit(0);

}//if

for(i=0;i<v;i++)

{

sum=0;

for(j=0;j<v;j++)

sum+=G[i][j];

if(sum%2==1)

{
k=1;

break;

}//if

}//for

if(k==1) printf("
該圖不存在歐拉迴路!
\n");

else

Euler(G,0);
return 1;
}

熱點內容
sqlserver位置 發布:2025-05-10 22:27:31 瀏覽:716
pythonsae 發布:2025-05-10 21:59:30 瀏覽:964
rdp演算法 發布:2025-05-10 21:46:40 瀏覽:918
c語言求素數的方法 發布:2025-05-10 21:46:39 瀏覽:764
戰地5配置最低怎麼設置 發布:2025-05-10 21:44:12 瀏覽:674
microsoftsql2012 發布:2025-05-10 21:43:33 瀏覽:428
電腦買個游戲伺服器 發布:2025-05-10 21:25:15 瀏覽:241
機櫃存儲空間 發布:2025-05-10 21:25:07 瀏覽:267
安卓手機如何修改首屏 發布:2025-05-10 21:17:59 瀏覽:959
緩存關聯替換 發布:2025-05-10 20:56:34 瀏覽:618