103 - Stacking Boxes

来源:互联网 发布:亳州安广网络客服电话 编辑:程序博客网 时间:2024/06/01 19:13
描述:像刘汝佳书上一样需要转化成有向图,然后再统计路最长的就可以了#include <cstdio>#include <cstring>#include <cstdlib>#define N 32int n,m,sum;int num[N][12],s[N],pos[N];bool next[N][N];int cmp(const void *p1,const void *p2){    return *(int *)p1 - *(int *)p2;}void dfs(int cur,int count){    int c=0;    for(int i=1; i<=n; i++)        if(next[cur][i])        {            s[count]=i;            c=1;            dfs(i,count+1);        }    if(!c&&count>sum)    {        sum=count;        for(int i=0; i<count; i++) pos[i]=s[i];    }}int main(){  //  freopen("a.txt","r",stdin);    while(scanf("%d %d",&n,&m)!=EOF)    {        memset(next,false,sizeof(next));        for(int i=1; i<=n; i++)        {            for(int j=0; j<m; j++) scanf("%d",&num[i][j]);            qsort(num[i],m,sizeof(int),cmp);            for(int j=1; j<i; j++)            {                int flag=0;                for(int k=0; k<m; k++)                    if(num[i][k]>num[j][k]) continue;                    else flag=1;                if(!flag) next[j][i]=true;                else                {                    flag=0;                    for(int k=0; k<m; k++)                        if(num[j][k]>num[i][k]) continue;                        else flag=1;                    if(!flag) next[i][j]=true;                }            }        }        sum=0;        for(int i=1; i<=n; i++)        {            s[0]=i;            dfs(i,1);        }        printf("%d\n%d",sum,pos[0]);        for(int i=1; i<sum; i++) printf(" %d",pos[i]);        puts("");    }    return 0;}