JZOJ 1319. 邮递员

Description

  邮局需要你来帮助他们为某个邮递员设计出一条能够穿过那遥远乡村的所有村子和小路至少一次的邮路(输入数据将会保证这么一条路是一定存在的)。
  但是,每条路线都是有一个花费的。各个村子里的村民希望邮递员到达他们村子的时间越早越好。因此,各个村子里的人们采用了一些措施:假设第i号村子是邮递员在他的邮递路线上到达的第k个不同的村子。如果k<=w( i ),那么这个村子的村民就会付给邮局w( i )-k欧元。当然,如果k>w(i),邮局也同意付k- w( i )欧元给这个村子,重复经过村子不重复收费。此外,邮递员每经过一条小路,邮局也要付给邮递员1欧元作为补贴。
  现在有n个村子,编号依次为1到n。邮局就位于1号村子,因此邮递员的传递路线从这里开始,也从这个村子结束。能够离开每个村子的路口的数目一定是2,4或者8。这里允许出现同样的村子间存在多条小路,或者某条小路构成了一个自环的情况。
  你的任务是设计一个路线使得邮局赚的钱最多(或者说赔的钱最少。如果有多种最优解,输出字典序最小的。

Input

  第一行:两个整数n,m,分别表示村子的数量和小路的数量。
  接下来n行,每行一个整数:w(i)(1≤w(i)<1 000)
  接下来m行,每行两个整数u,v,表示这条小路连接的村子的编号。

Output

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

Sample Input

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

Sample Output

7
1 2 4 5 1 3 6 1

Data Constraint

 
对于30%的数据,有N<=20
对于100%的数据,有N<=200;

Solution

  • 显然,权值是没有任何用处的,怎么走答案都不会变。

  • 于是问题就变成了如何求最小字典序了,观察到一个点的出边都是偶数(2,4,8)

  • 那么这就是经典的欧拉回路,可以贪心地求解。

  • 从小到大递归下去,退栈时加入答案,最后将答案倒序输出即可, O(N2) 解决。

Code

#include<cstdio>
using namespace std;
const int N=201;
int n,m;
int ans[N*8],a[N][N];
inline int read()
{
    int X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}
inline void dfs(int x)
{
    for(int i=1;i<=n;i++)
        if(a[x][i])
        {
            a[x][i]--,a[i][x]--;
            dfs(i);
        }
    ans[++ans[0]]=x;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++) read();
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read();
        a[x][y]++,a[y][x]++;
    }
    dfs(1);
    printf("%d\n",ans[0]-1);
    for(int i=ans[0];i;i--) printf("%d ",ans[i]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值