欧拉回路(一笔画)

欧拉回路判断:

对于无向图:1.两个或没有奇点;2.图连通;

对于有向图:1. 两种 (1)一个点出度大于入度1且另一个点入度大于出度1; (2)入度都等于出度; 2.图连通;


判断图连通1.dfs;2.bfs;3.floodfill; 即从某个点出发能否把所有点都遍历到;


输出欧拉路径: 从上述任一奇点出发(若无奇点则任一点出发就好);

1) 随便找一条未走过的相通的边走,走一条就删去一条边,直到没有一条边能走,就push这个点到堆栈中,返回上一个点,然后重复操作1); 

2) 输出堆栈内容即为答案;


 这个是因为是随便选一条边走的,所以可能存在未走完所有边就回来的情况,所以对于每个点都要递归返回来看有没有另一条边可走;


代码实现(倒序输出路径的):

无向图:

void euler (int u)
{
	for(int v=0;v<n;v++)
	if((G[u][v]||G[v][u])&&!vis[u][v])
	{
		vis[u][v]=vis[v][u]=1;
		euler(v);
		printf("%c %c\n",u,v);
	}
}
有向图:

void euler (int u)
{
	for(int v=0;v<n;v++)
	if(G[u][v]&&!vis[u][v])
	{
		vis[u][v]=1;
		euler(v);
		printf("%c %c\n",u+'A',v+'A');
	}
}

对于一些无法走完边的回路,如七桥问题,上述代码也能输出连通所有点但未走完所有边的欧拉回路;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值