Codeforces 673D Bear and Two Paths【贪心】

来源:互联网 发布:数控铣床编程简单100例 编辑:程序博客网 时间:2024/06/05 16:12

D. Bear and Two Paths
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Bearland has n cities, numbered 1 through n. Cities are connected via bidirectional roads. Each road connects two distinct cities. No two roads connect the same pair of cities.

Bear Limak was once in a city a and he wanted to go to a cityb. There was no direct connection so he decided to take a long walk, visiting each cityexactly once. Formally:

  • There is no road between a and b.
  • There exists a sequence (path) of n distinct citiesv1, v2, ..., vn thatv1 = a,vn = b and there is a road betweenvi andvi + 1 for.

On the other day, the similar thing happened. Limak wanted to travel between a cityc and a city d. There is no road between them but there exists a sequence ofn distinct cities u1, u2, ..., un thatu1 = c,un = d and there is a road betweenui andui + 1 for.

Also, Limak thinks that there are at most k roads in Bearland. He wonders whether he remembers everything correctly.

Given n, k and four distinct citiesa, b,c, d, can you find possible paths(v1, ..., vn) and(u1, ..., un) to satisfy all the given conditions? Find any solution or print-1 if it's impossible.

Input

The first line of the input contains two integers n andk (4 ≤ n ≤ 1000,n - 1 ≤ k ≤ 2n - 2) — the number of cities and the maximum allowed number of roads, respectively.

The second line contains four distinct integersa, b,c and d (1 ≤ a, b, c, d ≤ n).

Output

Print -1 if it's impossible to satisfy all the given conditions. Otherwise, print two lines with paths descriptions. The first of these two lines should containn distinct integers v1, v2, ..., vn wherev1 = a andvn = b. The second line should containn distinct integers u1, u2, ..., un whereu1 = c andun = d.

Two paths generate at most 2n - 2 roads:(v1, v2), (v2, v3), ..., (vn - 1, vn), (u1, u2), (u2, u3), ..., (un - 1, un). Your answer will be considered wrong if contains more than k distinct roads or any other condition breaks. Note that (x, y) and (y, x) are the same road.

Examples
Input
7 112 4 7 3
Output
2 7 1 3 6 5 47 1 5 4 6 2 3
Input
1000 99910 20 30 40
Output
-1
Note

In the first sample test, there should be 7 cities and at most11 roads. The provided sample solution generates 10 roads, as in the drawing. You can also see a simple path of length n between 2 and 4, and a path between 7 and 3.



题目大意:

给你一个包含N个点的无向图,要求我们用小于等于K条边来构造出这个图。

这个图有两对起点和终点:a,b,c,d;

现在要求构造出的图,a和b之间没有直接相连的边,c和d之间没有直接相连的边。

但是从a到b有一条路径,a作为起点,b作为终点,路径上包含所有点(1.2.3.4.5..............N)。

同理,从c到d也有一条路径,c作为起点,d作为终点,路径上也包含所有点。


思路:


1、因为边数有限制,我们肯定是想用最少的边数来完成这个任务。

对于从a到b的路径,用最少的边肯定就是让a作为起点,b作为终点的同时,其他点作为中间点,构成一个欧拉路径。

比如样例我们就可以很简单的构造出来一种可行答案:2 1 3 5 6 74


2、但是现在又要求要有一条从c到d的路径。那么我们此时希望从c到d的这条欧拉路经和从a到b的路径分享更多的重边。

通过简单的设想,我们不难发现,当我们设定从a到b的路径为:

a c u............v d b

同时设定从c到d的路径为:

c a u............v b d

的时候,我们只要在从a到b的欧拉路径的基础上,增加两条边就能够使得整个图满足题目要求的条件【(a,u),(v,b)】。


3、注意N==4的时候,无论怎样设定都会有相邻的情况。


Ac代码:

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int vis[100060];int ans[100060];int ans2[100060];int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        memset(vis,0,sizeof(vis));        int a,b,c,d;        scanf("%d%d%d%d",&a,&b,&c,&d);        if(n==4||m<n+1)        {            printf("-1\n");            continue;        }        ans[1]=a;        ans[n]=b;        ans[2]=c;        ans[n-1]=d;        int cnt=3;        for(int i=1;i<=n;i++)        {            if(i!=a&&i!=b&&i!=c&&i!=d)ans[cnt++]=i;        }        for(int i=1;i<=n;i++)        {            printf("%d ",ans[i]);        }        printf("\n");        ans2[1]=c;        ans2[n]=d;        ans2[2]=a;        ans2[n-1]=b;        cnt=3;        for(int i=1;i<=n;i++)        {            if(ans[i]!=a&&ans[i]!=b&&ans[i]!=c&&ans[i]!=d)ans2[cnt++]=ans[i];        }        for(int i=1;i<=n;i++)        {            printf("%d ",ans2[i]);        }        printf("\n");    }}








0 0
原创粉丝点击