【USACO题库】3.3.1 Riding the Fences骑马修栅栏

此题为裸的欧拉回路。
题目大意:求字典序最小的欧拉回路
题目说保证有解,所以我们不用在意↙

所有点的度为偶数 (判欧拉回路的存在)

度为奇数的点=2,存在一条欧拉路

度为奇数的点>2,不存在欧拉路

我们只需每次选一个度为奇数的点为起点找欧拉回路。
PS:要求字典序最小

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,ma=0,a[510][510],t[510],road[1030],tot=0;

inline int read()
{
	int x=0; char c=getchar();
	while (c<'0' || c>'9') c=getchar();
	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x; 
}

void dg(int x)
{
	for(int i=1;i<=ma;i++)
		if(a[x][i]) a[x][i]--,a[i][x]--,dg(i);
	road[++tot]=x;
}

void euler()
{
	for(int i=1;i<=ma;i++)
		if(t[i]%2) {dg(i); return;}
	dg(1); 
}

int main()
{
	n=read();
	for(int i=1,u,v;i<=n;i++)
	{
		u=read(),v=read();
		a[u][v]++,a[v][u]++;
		t[u]++,t[v]++;
		if (u>ma) ma=u;
		if (v>ma) ma=v;
	}
	euler();
	for(int i=tot;i>0;i--)
		printf("%d
",road[i]);
	return 0;
}
转载需注明出处。
原文地址:https://www.cnblogs.com/jz929/p/11817726.html