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


 

 

posted @ 2013-04-25 13:09  javawebsoa  Views(160)  Comments(0)    收藏  举报