欧拉回路最经典的是哥尼斯堡七桥问题。
首先,从一个节点出发,遍历与它有关联的边(节点),并且将这个节点标记。
void euler(int u){
for(int i=0;i<n;++i){
if(G[u][i]&&!vis[u][i]){
vis[u][i]=vis[i][u]=1;
euler(i);
cout<<u<<' '<<i<<endl;
}
}
}
与拓扑排序中一样,这里G数组也是关联矩阵。在无向图中,关联矩阵是对称阵,所以在标记时
vis[u][i]=vis[i][u]=1;
代码如下
#include<iostream>
using namespace std;
const int maxn=100;
int vis[maxn][maxn];
int G[maxn][maxn];
int n;
void euler(int u){
for(int i=0;i<n;++i){
if(G[u][i]&&!vis[u][i]){
vis[u][i]=vis[i][u]=1;
euler(i);
cout<<u<<' '<<i<<endl;
}
}
}
int main(){
cin>>n;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i){
for(int t=i;t<n;++t){
cin>>G[i][t];
G[t][i]=G[i][t];
}
}
int s;
cin>>s;
euler(s);
return 0;
}
在输入的时候因为无向图是对称的,所以只用输入对称的一边,同时将另一边赋值就行。对于欧拉回路,输入的s只用是其中一个节点就行。如果是通路输入的s必须是起点,要不然有些路径必然便利不到。对于不是欧拉图的图,也可以输入,但是输出就只能是跟输入节点有关系的欧拉图。