欧拉(通)回路
欧拉道路:
概念:
从无向图中的一个结点出发走出一条道路,每条边恰好经过一次。这样的路线称为欧拉道路,也可形象的称为“一笔画”。
性质:
除了起点和终点以外,其他点的“进出”次数应该相等。换句话说,除了起点和终点以外,其他点的度数应该是偶数;
这也就引出了欧拉道路的充分条件:如果一个无向图是连通的,且最多只有两个奇点,则一定是欧拉道路。且必须从一个奇点出发,另一个奇点终止;如果没有奇点,那么可以从任意点出发,最终会回到起点,这也就是欧拉回路
这个性质也可以用到有向图中:
最多只有两个点的入度不等于出度,而且必须是其中一个点的出度恰好比入度大1,另一个的入度比出度大1,前提是这个图连通;
伪代码实现:
void dfs(int u){
for(int v=1;v<=n;v++){
if(ma[u][v]&&!vis[u][v]){
vis[u][v]=vis[v][u]=1;
dfs(v);
cout<<u<<" "<<v<<endl;//这里是倒序打印路径,如果要正序,入栈就行
}
}
}