H: Skiing
很显然是拓扑,用拓扑序做一次最长路就好了
#include <bits/stdc++.h>
#include <vector>
using namespace std;
const int maxn = 10010;
int q[maxn], f[maxn], a[maxn], n, m, l, r, ans, x, y, z;
struct Node {
int v, l;
Node() {}
Node(int vv, int ll): v(vv), l(ll) {}
};
vector<Node> G[maxn];
void init() {
l = r = 0;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) G[i].clear();
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
memset(q, 0, sizeof(q));
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &x, &y, &z);
a[y]++;
G[x].push_back(Node(y, z));
}
for (int i = 1; i <= n; i++) if (a[i] == 0) {
q[++r] = i;
}
ans = 0;
}
void work() {
while (l != r) {
l++;
int u = q[l];
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].v;
int l = G[u][i].l;
f[v] = max(f[v], f[u]+l);
ans = max(ans, f[v]);
a[v]--;
if (!a[v]) q[++r] = v;
}
}
}
int main() {
freopen("input.txt","r",stdin);
int T;
scanf("%d", &T);
while (T--) {
init();
work();
printf("%d\n", ans);
}
}