• codevs 2799 高校排名 加强版(最长链)


    2799 高校排名 加强版

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 Description

    大学排名现在已经非常流行。在网上搜索可查到关于中国大学排行的各个方面的消息。

    我们知道,在一大学里通常都由许多不同的“系”(专业)组成,比如计算机系(简称CS);电子工程系(简称EE);外语系(简称FLS),等等。在一个大学里,其某一专业也许国内排前几,但其他专业却默默无闻。因此,大多数大学排行榜都有不同专业的详细的排名。

    但是信息量如此巨大的光芒,却掩盖不了一个严重的问题:究竟哪个大学更好?幸运的是,波布博士提出了一个新概念“绝对更好”,使得这个难题能被部分解决。

    为了更好地阐述波布博士的新概念,我们举一个例子:

    假设现在有三大学:X大学、Y大学、Z大学。每所大学都有三个专业:CS,EE,FLS。而这三所大学三个专业国际公认的排名如下:

    CS排名:X>Y>Z(X>Y表示X的CS专业比Y的好)

    EE排名:X>Z>Y

    FLS排名:Z>X>Y

    显然,X大学的每个专业都比Y大学好,所以X大学绝对比Y大学好。运用这个概念我们就能比较出一些大学的优劣。

    现在波布博士有一份完整的各个大学不同专业的排名,他想找出这样的K个大学(U1,U2,U3…,Uk),Ui一定比Uj(i<j)好。

    你能告诉波布博士这个K的最大值么?

    输入描述 Input Description

    第一行有两个整数N,M(0<N,M≤100),表示有N所大学和M项专业。

    接下来的M行中,第i(1<=i<=m)行有N所大学的编号Uj(1≤j≤N,1≤Uj≤N),代表第i个专业N大学的排名(越在前的排名越前)。

    输出描述 Output Description

    输出文件应该一行,该行是K值的最大值。不需要多余的空格。

    样例输入 Sample Input

    3 3

    1 2 3

    1 3 2

    3 1 2

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    0<N,M≤100

    /*
    读入完后
    (n2m)处理 若一个学校A能比另一个学校B绝对好
    这个学校A向另一个B建一条边
    建完图后 找最长链 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 110
    using namespace std;
    int n,m,topt,ans;
    int first[maxn],f[maxn];
    int a[maxn][maxn];
    struct edge
    {
        int to;
        int next;
    }e[maxn*maxn];
    void add(int x,int y)
    {
        topt++;
        e[topt].to=y;
        e[topt].next=first[x];
        first[x]=topt;
    }
    int dfs(int x)
    {
        if(f[x])return f[x];
        int mx=1;
        for(int i=first[x];i;i=e[i].next)
        {
            int to=e[i].to;
            mx=max(mx,dfs(to)+1);
        }
        return f[x]=mx;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                int x;scanf("%d",&x);
                a[x][i]=j;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                int flag=0;
                for(int k=1;k<=m;k++)
                {
                    if(a[j][k]<=a[i][k])
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag)continue;
                add(i,j);
            }
        }
        for(int i=1;i<=n;i++)
          ans=max(ans,dfs(i));
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    软工实践寒假作业(1/2)
    java判断是否为数字
    前端测试工具Cypress
    StringBuffer&StringBuilder
    IO流
    kafka简介
    Python学习笔记10--unittest参数化
    python学习笔记9--日志模块logging
    Python学习笔记9-多线程和多进程
    python学习笔记9-单元测试unittest
  • 原文地址:https://www.cnblogs.com/dingmenghao/p/6006610.html
Copyright © 2020-2023  润新知