标签:
-1
题目大意:老板要发酬劳,但是工人酬劳不一样,有N个人,M种情况。a的酬劳一定
要高于b。每个人最低酬劳为888,问:老板最少要花费多少钱。
思路:以b->a为有向边建立拓扑排序,不满足排序就输出"-1",否则就进行拓扑排序,
将拓扑排序的点看成一层一层的,无入度的为第一层,通过一条边能走到的为第二层。
通过两条边才能走到的为第三层。每一层都比前一层多一块钱。最后输出总钱数。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 10010; const int MAXM = 20010; int head[MAXN],N,M,ans,indegree[MAXN],queue[MAXN],money[MAXN]; struct EdgesNode { int to; int w; int next; }; EdgesNode Edges[MAXM]; int toposort() { int iq = 0; for(int i = 1; i <= N; i++) { if(indegree[i]==0) queue[iq++] = i; } for(int i = 0; i < iq; i++) { ans += money[queue[i]]; for(int k = head[queue[i]]; k != -1; k = Edges[k].next) { indegree[Edges[k].to]--; if(indegree[Edges[k].to] == 0) { money[Edges[k].to] = money[queue[i]] + 1; //money[Edges[k].to] = money[k] + 1;是错的。 queue[iq++] = Edges[k].to; } } } if(iq == N) return ans; else return 0; } int main() { int x,y; while(cin >> N >> M) { memset(head,-1,sizeof(head)); memset(Edges,0,sizeof(Edges)); memset(indegree,0,sizeof(indegree)); memset(queue,0,sizeof(queue)); memset(money,0,sizeof(money)); for(int i = 0; i < M; i++) { cin >> x >> y; Edges[i].to = x; Edges[i].w = 1; Edges[i].next = head[y]; head[y] = i; indegree[x]++; } ans = N*888; if(!toposort()) cout << "-1" << endl; else cout << ans << endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/42080821