题意:Bearland有n个城市,从1到n编号。城市通过双向道路连接,每条道路连接了两个不同的城市。Bear Limak想从城市a去到城市b,这里没有直达的路从a直接到b,必须经过一些城市,具体来说,他要从a到b,每个城市必须都经过一次,确切地来说,这里存在一个序列,\(v1,v2,...,vn\)\(v1 == a,vn == b\)。现在给定n,k,a,b,c,d,求构造两条路径a到b,c到d,使得这些构造的路径的方案的边的数量<= k,并且每个城市都经过一次。

分析:贪婪地构造,我们可以这样构造
,我们可以让a,c靠在一起,b,d靠在一起,中间的其余点输出就行,第二条方案路径只要添加两条边就可以了,这样可以使得构造的边的数量最少,数量为n + 1,如果k < n + 1,则输出-1,当然4个点的时候,也需要输出-1。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int n, k;
	scanf("%d%d", &n, &k);

	int a, b, c, d;
	scanf("%d%d%d%d", &a, &b, &c, &d);

	if (k < n + 1 || n == 4)
		printf("%d\n", -1);
	else
	{
		printf("%d %d ", a, c);
		vector<int> v;
		//剩下的点
		for (int i = 1; i <= n; ++i)
		{
			if (i != a && i != b && i != c && i != d)
			{
				v.push_back(i);
				printf("%d ", i);
			}
		}
		printf("%d %d\n", d, b);

		printf("%d %d ", c, a);
		for (int i = 0; i < v.size(); ++i)
		{
			printf("%d ", v[i]);
		}
		printf("%d %d ", b, d);
	}

	return 0;
}