AC

许诺  •  25天前


#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

struct Edge {

int v;
int w;

};

int main() {

int n, m;
cin >> n >> m;
vector<vector<Edge>> adj(n + 1);
vector<int> in_degree(n + 1, 0);

for (int i = 0; i < m; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    adj[u].push_back({v, w});
    in_degree[v]++;
}

vector<int> topo_order;
queue<int> q;

for (int i = 1; i <= n; ++i) {
    if (in_degree[i] == 0) {
        q.push(i);
    }
}

while (!q.empty()) {
    int u = q.front();
    q.pop();
    topo_order.push_back(u);
    
    for (const Edge& e : adj[u]) {
        int v = e.v;
        in_degree[v]--;
        if (in_degree[v] == 0) {
            q.push(v);
        }
    }
}

vector<long long> dist(n + 1, LLONG_MIN);
dist[1] = 0;

for (int u : topo_order) {
    if (dist[u] != LLONG_MIN) {
        for (const Edge& e : adj[u]) {
            int v = e.v;
            int w = e.w;
            if (dist[v] < dist[u] + w) {
                dist[v] = dist[u] + w;
            }
        }
    }
}

if (dist[n] == LLONG_MIN) {
    cout << -1 << endl;
} else {
    cout << dist[n] << endl;
}

return 0;

}


评论:

请先登录,才能进行评论