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; }