这道题题意很简单,老板给员工发福利,有些员工要求自己的福利必须比某个人高,老板希望在满足所有人的要求下,总花费最小。
拓扑排序分层,反向建表,正向也可以,只不过计算稍微麻烦些,但更接近题意。
这道题我还是卡了一会的,一开始用下标模拟堆栈的方法wa了好多次,后来试着调用stl的栈,接着wa,才发现是自己的分层策略和栈的性质不相容。
我的分层策略是,若有个点,在删去一个边之后入度变为0,则这个点的层数为刚刚删掉的那条边的起点的层数加1。
使用这种策略加上用栈会在处理一些特殊情况是发生错误。后来改为用队列才AC。
#include#include #include #include #include using namespace std;int counter[10005];int Rank[10005];int N,M;vector > v;bool TopoOrder(){ queue S; int top=-1; //下表模拟堆栈 for(int i=1;i<=N;i++) { if(counter[i]==0) { Rank[i]=0; S.push(i); } } //弹栈顶操作一共要进行N次,每次拿出一个顶点,删去它所连接的边,共有N个顶点所以要做N次 for(int i=0;i