2 1 1 2 2 2 1 2 2 1
1777 -1
題目大意:
n個人,m條邊,每條邊a,b 表示a比b的工資要多,每個人的工資至少888,問滿足關系的工資總和至少多少?如果出現關系矛盾,輸出-1
解題思路:
根據工資關系建立拓撲圖,0入度的人工資從888開始,一層一層,逐漸增加工資,若最後還有人入度不為0,則出現矛盾。
參考代碼:
#include#include #include #include using namespace std; const int MAXN = 10010; int inDegree[MAXN], ans, cnt, n, m; vector child[MAXN]; struct State { int reward, node; State(int _reward, int _node) : reward(_reward), node(_node) {} }; queue q; void init() { memset(inDegree, 0, sizeof(inDegree)); for (int i = 0; i <= n; i++) { child[i].clear(); } ans = cnt = 0; while (!q.empty()) q.pop(); } void input() { for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; inDegree[a]++; child[b].push_back(a); } } void work() { for (int i = 1; i <= n; i++) { if (inDegree[i] == 0) { q.push(State(888, i)); cnt++; } } while (!q.empty()) { State cur = q.front(); q.pop(); ans += cur.reward; for (int i = 0; i < child[cur.node].size(); i++) { inDegree[child[cur.node][i]]--; if (inDegree[child[cur.node][i]] == 0) { q.push(State(cur.reward+1, child[cur.node][i])); cnt++; } } } } void output() { if (cnt == n) { cout << ans << endl; } else { cout << -1 << endl; } } int main() { ios::sync_with_stdio(false); while (cin >> n >> m) { init(); input(); work(); output(); } return 0; }