www.pudn.com > Fleury.rar > Fleury.cpp, change:2008-06-03,size:1668b


#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(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); 
		} 
		else 
			Push(S,x); 
	} 
} 
 
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); 
				} 
	} 
	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 k=0,m; 
	SqStack S; 
	InitStack(S); 
	DFS(G,S,x,0); 
	cout<<"该图的一个欧拉回路为:"; 
	while(!StackEmpty(S)) 
	{ 
		GetTop(S,m); 
		cout<<m+1; 
		Pop(S); 
	} 
	cout<<endl; 
} 
 
 
void main() 
{ 
	int i,j,m,n,sum,k=0; 
	Graph G; 
	cout<<"输入图的顶点数:"; 
	cin>>v; 
	cout<<"输入图边的数目:"; 
	cin>>e; 
	for(i=0;i<v;i++) 
		for(j=0;j<v;j++) 
			G[i][j]=0; 
	cout<<"输入"<<e<<"条边对应的顶点\n"; 
	for(i=0;i<e;i++) 
	{ 
		cout<<"第"<<i+1<<"条边:"; 
		cin>>m; 
		cin>>n; 
		G[m-1][n-1]=1; 
		G[n-1][m-1]=1; 
	} 
	if(BFSTest(G)==0)  
	{ 
		cout<<"该图不是连通图!\n"; 
		exit(0); 
	} 
	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(k==1) cout<<"该图不存在欧拉回路!\n"; 
	else 
		Euler(G,0); 
 
}