103Stacking Boxes

103Stacking Boxes,第1张

描述:像刘汝佳书上一样需要转化成有向图,然后再统计路最长的就可以了
#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;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/2085986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存