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;

}


 

 

你可能感兴趣的:(HDU)