POJ2230 Watchcow 欧拉回路[dfs+邻接表]

博客介绍了如何使用深度优先搜索(DFS)结合邻接表解决POJ2230 - Watchcow问题。这是一个涉及欧拉回路的无向图问题。通过将无向图视为有向图并调整DFS的终止条件,当某个点无法继续前进时才停止。由于欧拉回路的对称性,不需要栈来辅助输出路径,直接从起点1开始即可满足题意。这是作者初次接触欧拉图,认为此题相对简单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:很显然是一个欧拉无向图。

因为要遍历每个边两遍而且方向不同。

所以可以看成是有向图来处理。

以下代码是 dfs+邻接表。

这里注意的dfs和普通的dfs不一样在于终止条件。

以前的dfs都是找到某个点后终止,现在是直到遇到某个点,那个点已经无路可走了,再终止。(因为题目已经保证要求的路径存在)

还有就是有些人估计疑惑为什么没用到栈来输出。

其实不用栈的原因很简单,就是欧拉回路的路径是对称。起点终点都是1,你从终点走过来和从起点走过来都是符合题意。


第一次接触欧拉图,还有这题算简单的,一次AC水过。

#include<iostream>
using namespace std;
const int N=10005;
const int M=50005;
int n,m;
int k=1;
struct Edge
{
	int v,next,re;
	bool vis;
}edge[2*M];
int edgehead[N];
void addedge(int from,int to)
{
	edge[k].v=to;
	edge[k].next=edgehead[from];
	edge[k].vis=0;
	edge[k].re=k+1;
	edgehead[from]=k;
	k++;
	edge[k].v=from;
	edge[k].vis=0;
	edge[k].re=k-1;
	edge[k].next=edgehead[to];
	edgehead[to]=k;
	k++;
}
void dfs(int now)
{
	for(int i=edgehead[now];i;i=edge[i].next)
	{
		if(!edge[i].vis)//这个深搜的终止条件是每个边都结束了。
		{
			edge[i].vis=true;
			dfs(edge[i].v);
		}
	}
	printf("%d\n",now);
}
void solve()
{
	dfs(1);
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值