hdu-2647 Reward

2015-07-20 17:49:22 · 作者: · 浏览: 8

?

//逆拓扑排序 ,首先常规思路是从入度为0的点开始向后推,但是你不知道后面会有多少个入度不一样的点,那么换一种思路,如果从后往前推,是不是就能解决问题。

这里 盗用一张图,

\

?

上图分成3个层次,那么第三层每个人的需求都是888,往上一层,就加1,把最下一层当成入度为0的点,逆推上去。因为边比较多,可以用vector来表示邻接表。

?

#include
  
   
#include
   
     #include
    
      #include
     
       #define N 10001 using namespace std; int in[N],mark[N],n,m; vector
      
       v[20001]; void init() { memset(in,0,sizeof(in)); memset(mark,0,sizeof(mark)); for(int i=0;i
       
        q; for(int i=1;i<=n;i++) if(in[i]==0) { q.push(i); //把入度为0的点放入队列 mark[i]=888; //初始值为888 } while(!q.empty()) { int t=q.front(); q.pop(); for(int i=0;i
        
         

?