hdu 2647 Reward

来源:互联网 发布:node.js promise 编辑:程序博客网 时间:2024/06/05 03:23

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

我看了别人的优先队列做法,思路差不多。。
//但是我想既然已经确定给最差的那个人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;}
0 0
原创粉丝点击