Submission #601436

#TimeUsernameProblemLanguageResultExecution timeMemory
601436narvaloFerries (NOI13_ferries)C++17
28 / 40
249 ms30544 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = (int)1e12; int ferries() { int n , m; cin >> n >> m; vector<vector<pair<int , int>>> old_adj(n) , adj(n); vector<vector<int>> edges(n); for (int i = 0 ; i < m ; i++) { int a , b , c; cin >> a >> b >> c; a -= 1 , b -= 1; old_adj[a].emplace_back(b , c); edges[a].push_back(c); } for (int i = 0 ; i < n ; i += 1) { sort(edges[i].rbegin() , edges[i].rend()); } vector<int> vis(n); function<bool(int)> Dfs = [&](int node) { if (vis[node] == 1) { return false; } else if (vis[node] == 2) { return true; } vis[node] = 1; for (auto x : old_adj[node]) { if (Dfs(x.first)) { adj[node].push_back(x); } } vis[node] = 2; return true; }; for (int i = 0 ; i < n ; i++) { Dfs(i); } for (int i = 0 ; i < n ; i++) { for (int j = 0 ; j < (int)adj[i].size() ; j += 1) { adj[i][j].second = edges[i][j]; } } vector<int> dp(n , -1); function<int(int)> Solve = [&](int node) -> long long { if (node == n - 1) { return 0; } if (dp[node] != -1) { return dp[node]; } vector<int> d; for (auto x : adj[node]) { d.push_back(Solve(x.first)); } sort(d.begin() , d.end()); vector<int> s; for (int i = 0 ; i < (int)adj[node].size() ; i += 1) { s.push_back(adj[node][i].second); } sort(s.begin() , s.end()); auto Get = [&]() { int val = INF; for (int i = 0 ; i < (int)s.size() ; i += 1) { val = min(val , s[i] + d[(int)s.size() - i - 1]); } return val; }; int res = Get(); return dp[node] = res; }; int res = Solve(0); return res; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout << ferries() << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...