hdu 2647 Reward

这样写居然过了。。
还以为会超时。。
看到了别人用优先队列做,膜拜,膜拜。。我怎么就没想到(感觉自己的方法跟做模拟题差不多)。。

我看了别人的优先队列做法,思路差不多。。
//但是我想既然已经确定给最差的那个人888,其他人就已经确定了。。用不着优先队列吧。。直接队列就好了

这句话应该有问题,,但是我找不出问题。。希望有人看到后帮我解答一下。。万分感谢。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
struct node
{
    int who;
    int cnt;
    node *next;
}way[10010];
int how[10010];
int find(int a,int b)
{
    for(node *p=way[a].next;p;p=p->next)
    {
        if(p->who==b)
            return 1;
    }
    return 0;
}
void add(int a,int b)
{
    if(!find(a,b))
    {
        way[b].cnt++;
        node *p=new node;
        p->next=way[a].next;
        p->who=b;
        way[a].next=p;
    }
}
int main()
{

    int n,m;
    //int ok=1;纪念我的6发wa。。 mdzz。。
    while(scanf("%d%d",&n,&m)==2)
    {
        int ok=1;
        for(int i=1;i<=n;i++)
        {
            way[i].cnt=0;
            way[i].next=NULL;
        }
        int a,b;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            add(b,a);
        }
        int ans=0;
        int all=n;
        int i=0;
        while(all)
        {
            int num=0;
            for(int j=1;j<=n;j++)//这一步是为了找到相同level 的人们
            {
                if(way[j].cnt==0)
                {
                    way[j].cnt--;
                    ans=ans+888+i;
                    num++;
                    how[num]=j;//把这些人的编号全部收齐来,然后一起减掉他们的边
                    all--;
                }
            }
            if(num==0)
            {
                printf("-1\n");
                ok=0;
                break;
            }
            for(int j=1;j<=num;j++)
            {
                for(node *p=way[how[j]].next;p;p=p->next)
                {
                    way[p->who].cnt--;
                    if(way[p->who].cnt<0)//如果负的话,说明有环了。因为这个点,可能是已经删除的点或者是被某些点删了又删。。
                    {
                        printf("-1\n");
                        ok=0;
                        break;
                    }
                }
                if(!ok)
                    break;
            }
            if(!ok)
                break;
            i++;
        }
        if(ok)
        {
            printf("%d\n",ans);
        }
    }
    return 0;
}

你可能感兴趣的:(拓扑排序,HDU,邻接表)