欧拉道路:
除了起点终点外,其他点的度数应该是偶数。
有向图结论:
最多只能有两个点的入度不等于出度,而且必须是其中一个点的出度恰好比入度大一,(作为起点),另一个的入度比出度大一(作为终点),当然,还有一个前提条件,在忽略边的方向后,图必须是联通的。
下面是程序,同时适用于欧拉道路和回路,但是若需要打印的是欧拉道路,在主程序中调用时,参数必须是道路的起点,另外,打印的顺序是逆序的,因此在真正使用这个程序的时候,应该把printf
语句替换成一条push语句,把边(u,v)压入栈内。
void euler(int u){
for(int v=0;v<n;v++) if(G[u][v]&&!vis[u][v]){
vis[u][v]=vis[v][u]=1;
euler(v);
printf("%d %d",u,v);
}
}
尽管上面代码只适用于无向图,但不难改成有向图:把vis[u][v]=vis[v][u]=1改成vis[u][v]即可
提示:
根据连通性和度数可以判断出无向图和有向图是否存在欧拉道路和欧拉回路,可以用dfs构造欧拉道路和欧拉回路。