bzoj 1880 最短路径图

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg

using namespace std;

const int N = 1500 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;

int n, m, s1, t1, s2, t2, tot, head[N], d[N][N], dp[N];
vector<PII> G[N];

struct Edge {
    int from, to, w, nx;
} edge[2000007];

void add(int u, int v, int w) {
    edge[tot].from = u;
    edge[tot].to = v;
    edge[tot].w = w;
    edge[tot].nx = head[u];
    head[u] = tot++;
}

void Dij(int S, int *d) {
    priority_queue<PII, vector<PII>, greater<PII> > que;
    que.push(mk(0, S)), d[S] = 0;
    while(!que.empty()) {
        PII now = que.top(); que.pop();
        int u = now.se, dis = now.fi;
        if(dis > d[u]) continue;
        for(int i = head[u]; ~i; i = edge[i].nx) {
            int v = edge[i].to, w = edge[i].w;
            if(dis + w < d[v]) {
                d[v] = dis + w;
                que.push(mk(d[v], v));
            }
        }
    }
}

int dfs(int u) {
    if(~dp[u]) return dp[u];
    dp[u] = 0;
    for(int i = 0; i < G[u].size(); i++) {
        int v = G[u][i].se, w = G[u][i].fi;
        dp[u] = max(dp[u], dfs(v) + w);
    }
    return dp[u];
}

int cal(int s1, int t1, int s2, int t2) {
    memset(dp, -1, sizeof(dp));
    for(int i = 1; i <= n; i++) G[i].clear();
    for(int i = 0; i < tot; i++) {
        int u = edge[i].from, v = edge[i].to, w = edge[i].w, f = 0;
        if(d[s1][u] + d[t1][v] + w == d[s1][t1]) f++;
        if(d[s2][u] + d[t2][v] + w == d[s2][t2]) f++;
        if(f == 2) {
            G[u].push_back(mk(w, v));
        }
    }
    int ans = 0;
    for(int i = 1; i <= n; i++)
        ans = max(ans, dfs(i));
    return ans;
}

int main() {
    memset(head, -1, sizeof(head));
    memset(d, inf, sizeof(d));
    scanf("%d%d", &n, &m);
    scanf("%d%d%d%d", &s1, &t1, &s2, &t2);
    for(int i = 1; i <= m; i++) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w); add(v, u, w);
    }

    Dij(s1, d[s1]);
    Dij(t1, d[t1]);
    Dij(s2, d[s2]);
    Dij(t2, d[t2]);

    int ans = 0;
    ans = max(ans, cal(s1, t1, s2, t2));
    ans = max(ans, cal(s1, t1, t2, s2));

    printf("%d\n", ans);
    return 0;
}

/*
*/

 

posted @ 2018-09-14 19:10  NotNight  阅读(134)  评论(0编辑  收藏  举报