Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <vector>
- #include <cassert>
- #include <cstdio>
- #ifdef _DEBUG
- const int MN = 100;
- #else
- const int MN = 1000 * 10 + 10;
- #endif
- using namespace std;
- #define ll long long
- #define pii pair <ll, int>
- #define mp make_pair
- const ll inf = (1ll << 55);
- priority_queue <pii> h;
- vector <ll> g[MN], w[MN];
- ll dp[4][MN];
- int n;
- void dfs(int v, int len, ll ww, int k) {
- if (!len)
- dp[k][v] = min(dp[k][v], ww);
- else {
- for(int i = 0; i < g[v].size(); i ++) {
- int to = g[v][i];
- dfs(to, len - 1, ww + w[v][i], k);
- }
- }
- }
- void solve(int st, int k) {
- for(int i = 0; i < n; i ++)
- if (dp[k][i] != inf)
- h.push(mp(-dp[k][i], i));
- dp[k][st] = 0;
- while (!h.empty()) {
- int v = h.top().second;
- ll d = -h.top().first;
- h.pop();
- if (d > dp[k][v])
- continue;
- for(int i = 0; i < g[v].size(); i ++) {
- int to = g[v][i];
- ll nw = max(dp[k][v], dp[k - 1][v] + w[v][i]);
- assert(dp[k][v] < inf);
- if (nw < dp[k][to]) {
- dp[k][to] = nw;
- h.push(mp(-nw, to));
- }
- }
- }
- }
- int main () {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- fill(&dp[0][0], &dp[0][0] + 4 * MN, inf);
- for(int i = 0; i < MN; i ++)
- dp[0][i] = 0;
- int m, a, b;
- scanf("%d%d", &n, &m);
- for(int i = 0; i < m; i ++) {
- int x, y, z;
- scanf("%d%d%d", &x, &y, &z);
- x --, y --;
- g[x].push_back(y);
- g[y].push_back(x);
- w[x].push_back(z);
- w[y].push_back(z);
- }
- scanf("%d%d", &a, &b);
- a --, b --;
- dfs(a, 1, 0, 1);
- ll best = dp[1][b];
- dfs(a, 2, 0, 2);
- //dfs(a, 3, 0, 3);
- solve(a, 1);
- solve(a, 2);
- //solve(a, 3);
- dp[2][b] = min(dp[2][b], best);
- cout << dp[2][b] << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment