题目链接:https://vjudge.net/problem/HDU-2647
逆拓扑问题,反向建图,广度优先搜索
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m;
void solve() {
vector<vector<int> > g(n + 1);
vector<int> out(n + 1);
for (int i = 0; i < m; i ++) {
int a, b;
cin >> a >> b;
g[b].push_back(a); // 注意反向建图
out[a] ++;
}
queue<int> q;
for (int i = 1; i <= n; i ++)
if (out[i] == 0)
q.push(i);
int p = 888, sum = 0, cnt = 0;
while(q.size()) {
int t = q.size(); // 这t个节点的工资相同
cnt += t; //cnt用于统计有多少个节点被访问
sum += t * p;
p ++;
for (int i = 0; i < t; i ++) {
int u = q.front();
q.pop();
for (int j = 0; j < g[u].size(); j ++) {
int x = g[u][j];
out[x] --;
if (out[x] == 0) {
q.push(x); // 注意别push错,因为push(j) 找错找半天
}
}
}
}
if (cnt == n) {
cout << sum << endl;
} else {
cout << -1 << endl;
}
}
signed main() {
ios::sync_with_stdio(false);
while(cin >> n >> m) {
solve();
}
return 0;
}