103 - Stacking Boxes

描述:像刘汝佳书上一样需要转化成有向图,然后再统计路最长的就可以了

#include <cstdio>

#include <cstring>

#include <cstdlib>

#define N 32

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

}


你可能感兴趣的:(stack)