?
//逆拓扑排序 ,首先常规思路是从入度为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
?