小白6.4.4欧拉回路

来源:互联网 发布:怎样进自己的淘宝店铺 编辑:程序博客网 时间:2024/05/01 21:54

欧拉回路最经典的是哥尼斯堡七桥问题。

首先,从一个节点出发,遍历与它有关联的边(节点),并且将这个节点标记。

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必须是起点,要不然有些路径必然便利不到。对于不是欧拉图的图,也可以输入,但是输出就只能是跟输入节点有关系的欧拉图。

原创粉丝点击