骑马修栅栏 Riding the Fences

本文介绍了解决洛谷P2731问题的欧拉路径算法,通过搜索策略找到满足两个点度数为奇数或所有点度数为偶数的欧拉路径或回路。代码实现采用C++,从最小点开始搜索,确保满足题目要求。

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

题目

https://www.luogu.org/problemnew/show/P2731

思路

欧拉路径模板题
求欧拉路径的合兴思路是搜索

一个欧拉路径满足有两个度数为奇数的点背奇数条边连着
一个欧拉回路满足所有点的度数为偶数

怎么求很明显了

我们只要找一个尽量小的点为起点,即可满足题目要求

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=577,inf=0x3f3f3f3f;
int n,ss,s=inf,a[maxn][maxn],d[maxn],ans[maxn];
void find(int x)
{
	for(int i=1; i<=500; i++)
	{
		if(a[x][i])
		{
			a[x][i]--; a[i][x]--; find(i);
		}
	}
	ans[ss--]=x;
}
int main()
{
	scanf("%d",&n);
	ss=n+1;
	for(int i=1; i<=n; i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		a[x][y]++; a[y][x]++; d[x]++; d[y]++;
		s=min(s,min(x,y));
	}
	int t=inf;
	for(int i=1; i<=500; i++) if(d[i]&1)
	{
		t=i; break;
	}
	if(t<inf) find(t);else find(s);
	for(int i=1; i<=n+1; i++) printf("%d\n",ans[i]);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值