您的位置:首页 > 其它

hdu 2647 Reward

2016-05-01 15:13 288 查看
这样写居然过了。。

还以为会超时。。

看到了别人用优先队列做,膜拜,膜拜。。我怎么就没想到(感觉自己的方法跟做模拟题差不多)。。

我看了别人的优先队列做法,思路差不多。。

//但是我想既然已经确定给最差的那个人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 拓扑排序 邻接表