题目长……
题目本身是一道很水的LIS题。
时间:0毫秒。
空间:180KB。
//Time:0ms
//Memory:180Kbytes
//User:Lostwinder
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
struct gene{
int u,v,num;
}g[1004];
void swap(int *a,int *b){
int t=*a;*a=*b;*b=t;
}
int cmp(const void *a,const void *b){
int k=(*(gene *)a).u-(*(gene *)b).u;
if(k)return k;
else return (*(gene *)a).v-(*(gene *)b).v;
}
int main(){
int i,j,d[1004],prev[1004],n,mx,stack[1004],top;
while(1){
scanf("%d",&n);
if(!n)break;
for(i=0;i<n;i++){
scanf("%d%d",&g[i].u,&g[i].v);
if(g[i].u>g[i].v)swap(&g[i].u,&g[i].v);
g[i].num=i+1;
}
qsort(g,n,sizeof(g[0]),cmp);
memset(d,0,sizeof(d));
memset(prev,-1,sizeof(prev));
d[0]=1;
for(i=1;i<n;i++){
d[i]=1;
for(j=0;j<i;j++){
if((d[j]+1>d[i])&&(g[j].v<g[i].u)){
d[i]=d[j]+1;
prev[i]=j;
}
}
}
top=0;mx=-1;
for(i=0;i<n;i++){
if(d[i]>mx){
mx=d[i];
j=i;
}
}
top++;stack[top]=g[j].num;
while(prev[j]!=-1){
j=prev[j];
top++;
stack[top]=g[j].num;
}
/*for(i=0;i<n;i++){
printf("%d%c",d[i],(i==n-1)?'\n':' ');
}*/
for(i=top;i>=1;i--){
printf("%d%c",stack[i],(i==1)?'\n':' ');
}
}
return 0;
}