cogs 79. 渡轮问题(输出路径)

79. 渡轮问题

★☆   输入文件:maxxl.in   输出文件:maxxl.out   简单对比
时间限制:1 s   内存限制:128 MB

Palmia 河在某国从东向西流过,并把该国分为南北两个部分。河的两岸各有 n 个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的。现在要求在两个友好城市之间建立一条航线,但由于天气的关系,所有航线都不能相交,因此,就不可能给所有的友好城市建立航线。

问题:当城市个数和友好关系建立之后,选择一种修建航线的方案,能建最多的航线而不相交。(若有多种方案,修建航线最多且城市数量相同,选择从前到后城市标号字典序小的那种方案.)

【输入格式】

输入由若干行组成,第一行有一个整数,n(1≤n≤10000);表示城市数。第2至n+1行依次是南岸城市的北岸友好城市编号。

【输出格式】

输出共两行,第一行是建立航线的数量。第二行是建立航线的北岸城市编号。

【输入样例】

输入文件名:maxxl.in

14
13
7
9
16
38
24
37
18
44
19
21
22
63
15

【输出样例】

输出文件名:maxxl.out

8
7 9 16 18 19 21 22 63

#include<iostream>
#include<cstdio>
#define maxn 10010 
using namespace std;
int a[maxn],f[maxn],pre[maxn];
int main()
{
    freopen("maxxl.in","r",stdin);
    freopen("maxxl.out","w",stdout);
    int n,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        f[i]=1;
        pre[i]=i;
    }
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(a[j]>=a[i]&&f[j]<=f[i]+1)
            {
                if(f[j]<f[i]+1)
                {
                    f[j]=f[i]+1;
                    pre[j]=i;
                }
                else
                pre[j]=min(pre[j],i);
            }
        }
    }
    int maxx=0;
    for(i=1;i<=n;i++)
    if(f[i]>maxx)
    {
        k=i;
        maxx=f[i];
    }
    printf("%d\n",maxx);
    int b[maxn],l=0;
    while(k!=pre[k])
    {
        b[++l]=a[k];
        k=pre[k];
    }
    b[++l]=a[k];
    for(i=maxx;i>=1;i--)
    printf("%d ",b[i]);
    return 0;
}
 

 

posted @ 2016-06-06 11:35  岂是蓬蒿人  阅读(400)  评论(0编辑  收藏  举报