标签:
附上题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5695
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 100000 + 100; int N, M; vector<int> G[maxn]; int indegree[maxn]; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &N, &M); for(int i=1; i<=N; i++) { indegree[i] = 0; G[i].clear(); } for(int i=0; i<M; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); indegree[v]++; } priority_queue<int> que; for(int i=1; i<=N; i++) if(!indegree[i]) que.push(i); long long res = 0; int rk = inf; while(!que.empty()) { int num = que.top(); que.pop(); rk = min(rk, num); res += rk; for(int i=0; i<G[num].size(); i++) { int v = G[num][i]; indegree[v]--; if(!indegree[v]) que.push(v); } } printf("%lld\n", res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/xingxing1024/p/5546612.html