#P1503. 邮递员(carrier)

邮递员(carrier)

问题描述

邮局需要你来帮助他们为某个邮递员设计出一条能够穿过那遥远乡村的所有村子和小路至少一次的邮路(输入数据将会保证这么一条路是一定存在的)。

但是,每条路线都是有一个花费的。各个村子里的村民希望邮递员到达他们村子的时间越早越好。因此,各个村子里的人们采取了一些措施:假设第i号村子是邮递员在他的邮递路线上到达的第k个村子。如果k≤w(i),那么这个村子的村民就会付给邮局w(i)-k欧元。当然,如果k>w(i)),邮局也同意付k-w(i)欧元给这个村子,对某些村子重复经过要重复收费。此外,邮递员每经过一条小路,邮局也要付给邮递员1欧元作为补贴。

现在有n个村子,编号依次为1到n。邮局就位于1号村子,因此邮递员的传递路线从这里开始,也从这个村子结束。能够离开每个村子的路口的数目一定是2,4或者8。这里允许出现同样的村子问存在多条小路,或者某条小路构成了一个自环的情况。

你的任务是设计一条路线使得邮局赚的钱最多(或者说赔的钱最少。如果有多种最优解,输出字典序最小的。

输入carrier.in

第一行:两个整数n,m,分别表示村子的数量和小路的数量。

接下来n行,每行一个整数:w(i)(1≤w(i)<1000)。

接下来m行,每行两个整数u,v,表示这条小路连接的村子的编号。

输出carriar.ota

第一行:一个整数k,你的程序所设计的路径的长度。

第二行:k+1个整数,v1,v2,…,vk+1,每个数之间用一个空格隔开,表示你设计的路径所经过的村子的编号,其中需要满足v1=vk+1=1。

输入样例

6 7
1
7
4
10
20
5
2 4
1 5
2 1
4 5
3 6
1 6
1 3

输出样例

7
1 2 4 5 1 3 6 1

数据范围

对于30%的数据,有N≤20;

对于100%的数据,有N≤200。