杂谈笔记欧拉回路
18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来(如概述图)。有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。后来大数学家欧拉把它转化成一个几何问题——一笔画问题。他不仅解决了此问题,且给出了连通图可以一笔画的充要条件是:奇点的数目不是0个就是2个(连到一点的数目如是奇数条,就称为奇点,如果是偶数条就称为偶点,要想一笔画成,必须中间点均是偶点,也就是有来路必有另一条去路,奇点只可能在两端,因此任何图能一笔画成,奇点要么没有要么在两端)
转载于
https://baike.baidu.com/item/七桥问题
如果一个图能够一笔画,那么一笔画的路径就叫做欧拉路。
如果最后又回到起点,那么这个路径叫做欧拉回路。
C++代码:
void dfs(int i, int s)
{
p[s] = i;
if(s == m + 1)
{
print();
return ;
}
else
{
for(int j = 1; j <= n; j ++)
{
if(mp[i][j] == false)
{
mp[i][j] = mp[j][i] = true;
dfs(j, s + 1);
mp[i][j] = mp[j][i] = false;
}
}
}
}
BFS:
void bfs(int i)
{
int head = 0, tail = 1;
path[tail] = i;
pre[tail] = head;
int j;
while(head != tail)
{
head ++;
for(int j = 1; j <= n; j ++)
{
if(mp[i][j])
{
tail ++;
path[tail] = j;
pre[tail] = head;
mp[i][j] = mp[j][i] = false;
if(head == m)
{
print(tail);
return ;
}
break;
}
}
i = j;
}
}