• hdu 2647 (拓扑)


    点击打开链接


    分析:

    刚开始直接用模版WA了一次,后来想想才发现,可能有两个人(a和b)的工资没有要求a>b,所以这样就不能直接利用等差公式计算。。。



    WA:


    #include"stdio.h"
    #include"string.h"
    struct node
    {
        int num;//记录比他少的人的个数
        int cnt;//
        int date[20];//比他少的人的标号
    }A[10001];
    int topsort(int n)
    {
        int i,j,k,f;
        k=0;
        while(k<n)
        {
            f=0;
            for(i=1;i<=n;i++)
            {
                if(A[i].cnt==0)
                {
                    A[i].cnt--;
                    k++;
                    for(j=0;j<A[i].num;j++)
                    {
                        A[A[i].date[j]].cnt--;
                    }
                    f=1;
                    break;
                }
            }
            if(f==0)return 0;
        }
        return 1;
    }
    int main()
    {
        int n,m;
        int i,j;
        int a,b;
        while(scanf("%d%d",&n,&m)!=-1)
        {
            memset(A,0,sizeof(A));
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                A[a].date[A[a].num++]=b;
                A[b].cnt++;
            }
            int ans=topsort(n);
            if(ans==0)printf("-1\n");
            else printf("%d\n",n*(888*2+n-1)/2);
        }
        return 0;
    }


    AC:

    #include"stdio.h"
    #include"string.h"
    #define max(a,b) a>b?a:b;
    struct node
    {
        int ans;
        int num;//记录比他少的人的个数
        int cnt;//
        int date[20];//比他少的人的标号
    }A[10001];
    int topsort(int n)
    {
        int i,j,k,f,t;
        k=0;
        while(k<n)
        {
            f=0;
            for(i=1;i<=n;i++)
            {
                if(A[i].cnt==0)
                {
                    A[i].cnt--;
                    k++;
                    t=A[i].ans+1;
                    for(j=0;j<A[i].num;j++)
                    {
                        A[A[i].date[j]].cnt--;
                        A[A[i].date[j]].ans=max(A[A[i].date[j]].ans,t);
                    }
                    f=1;
                    break;
                }
            }
            if(f==0)return 0;
        }
        return 1;
    }
    int main()
    {
        int n,m;
        int i,j;
        int a,b;
        while(scanf("%d%d",&n,&m)!=-1)
        {
            memset(A,0,sizeof(A));
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                A[b].date[A[b].num++]=a;
                A[a].cnt++;
            }
            int ans=topsort(n);
            if(ans==0)printf("-1\n");
            else 
            {
                ans=0;
                for(i=1;i<=n;i++)
                    ans+=A[i].ans;
                ans+=888*n;
                printf("%d\n",ans);
            }
        }
        return 0;
    }


  • 相关阅读:
    数据结构八树和森林
    数据结构 七 二叉树的遍历
    python 的 encode 、decode、字节串、字符串
    TCP/IP
    pg 数据库操作
    nginx + lua 的 跳转命令
    lua string 下的函数
    lua 的匹配规则
    nginx的 ngx.var ngx.ctx ngx.req
    docker 网络模式 和 端口映射
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3042308.html
Copyright © 2020-2023  润新知