hdu 2647 Reward
2016-05-01 15:13
288 查看
这样写居然过了。。
还以为会超时。。
看到了别人用优先队列做,膜拜,膜拜。。我怎么就没想到(感觉自己的方法跟做模拟题差不多)。。
我看了别人的优先队列做法,思路差不多。。
//但是我想既然已经确定给最差的那个人888,其他人就已经确定了。。用不着优先队列吧。。直接队列就好了
这句话应该有问题,,但是我找不出问题。。希望有人看到后帮我解答一下。。万分感谢。。
还以为会超时。。
看到了别人用优先队列做,膜拜,膜拜。。我怎么就没想到(感觉自己的方法跟做模拟题差不多)。。
我看了别人的优先队列做法,思路差不多。。
//但是我想既然已经确定给最差的那个人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; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- Java:存储可变大小的二维数组
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- 图的邻接表存储
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟