H: Skiing

来源:互联网 发布:项城市乡镇人口数据 编辑:程序博客网 时间:2024/03/29 08:02

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);    }}
原创粉丝点击