欧拉回路
先说著名的Konigsberg七桥问题。有一条名为Pregel的河流经过Konigsberg城。城中有七条桥,把河中的两个岛与河岸连接起来。当地居民热衷与一个难题:是否存在一条线路,可以不重复的走遍7座桥。它有大数学家欧拉首先提出,并给出完美解答。用数据结构的语言描述就是:能否在这样的无向图中的一个节点出发走出一条道路,每条边恰好经过一遍。这样的线路称为欧拉道路(eulerian path),也就是俗说的“一笔画”。
不难发现:在欧拉道路中,“进”和“出”是对应的——除了起点和终点,其他点的“进出”次数相等。换句话说,除了起点和终点外,其他点的度数是偶数。很可惜,在七桥问题中,所有四个点的度数都是奇数(称为奇点),因此不可能存在欧拉道路。上述条件也是充分条件——如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路。如果奇点不存在,则称为欧拉回路。
类此的,可以得出有向图的结论:最多只能有两个点的入度不等于出路,而且必须是其中一个点的出度比入度恰好大1(起点),另一个的入度比出度大1(终点)。前提条件:在忽略边的方向后,图必须是连通的。
程序如下:
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;//适用于无向图,有向图改为:vis[u][v]=1
euler(v);
printf("%d %d\n",u,v);//逆序打印,如需正序,则替换为push语句,把(u,v)压入一个栈内
}
}
不难发现:在欧拉道路中,“进”和“出”是对应的——除了起点和终点,其他点的“进出”次数相等。换句话说,除了起点和终点外,其他点的度数是偶数。很可惜,在七桥问题中,所有四个点的度数都是奇数(称为奇点),因此不可能存在欧拉道路。上述条件也是充分条件——如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路。如果奇点不存在,则称为欧拉回路。
类此的,可以得出有向图的结论:最多只能有两个点的入度不等于出路,而且必须是其中一个点的出度比入度恰好大1(起点),另一个的入度比出度大1(终点)。前提条件:在忽略边的方向后,图必须是连通的。
程序如下:
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;//适用于无向图,有向图改为:vis[u][v]=1
euler(v);
printf("%d %d\n",u,v);//逆序打印,如需正序,则替换为push语句,把(u,v)压入一个栈内
}
}
浙公网安备 33010602011771号