求调 Hack过不了
查看原帖
求调 Hack过不了
415773
OIer_ACMer楼主2024/9/15 12:48
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3503;
int n, m, s[5];
struct Edge
{
    int from, to, next, w;
} edge[N * N];
int head[N], cnt = 0;
int dis[5][N];
void add(int u, int v, int w)
{
    edge[++cnt].to = v;
    edge[cnt].from = u;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt;
}
struct Edge0
{
    int to, next, w, is;
} edge0[N * N];
int head0[N], cnt0 = 0;
void add0(int u, int v, int w, int is)
{
    edge0[++cnt0].to = v;
    edge0[cnt0].w = w;
    edge0[cnt0].next = head0[u];
    edge0[cnt0].is = is;
    head0[u] = cnt0;
}
queue<int> q;
int vis[N], in[N];
void dij()
{
    memset(dis, 0x3f3f3f3f3f3f, sizeof(dis));
    for (int k = 1; k <= 4; k++)
    {
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
        memset(vis, 0, sizeof(vis));
        q.push(make_pair(0, s[k]));
        dis[k][s[k]] = 0;
        // cout << k << ' ' << s[k] << ' ' << q.top().first << ' ' << q.top().second << endl;
        while (!q.empty())
        {
            int x = q.top().second;
            q.pop();
            if (vis[x])
            {
                continue;
            }
            vis[x] = 1;
            // cout << "x=" << x << endl;
            for (int i = head[x]; i; i = edge[i].next)
            {
                int y = edge[i].to;
                int w = edge[i].w;
                // cout << "dis[" << k << "][" << y << "]=" << dis[k][y] << ' ' << "dis[" << k << "][" << x << "]=" << dis[k][x] << " w=" << w << endl;
                if (dis[k][y] > dis[k][x] + w)
                {
                    dis[k][y] = dis[k][x] + w;
                    q.push(make_pair(dis[k][y], y));
                }
                // cout << "abab " << "dis[" << k << "][" << y << "]=" << dis[k][y] << ' ' << "dis[" << k << "][" << x << "]=" << dis[k][x] << " w=" << w << endl;
            }
        }
    }
}

void build()
{
    // cout << "res=\n";
    // for (int i = 1; i <= 4; i++)
    // {
    //     cout << dis[i][s[i]] << endl;
    // }
    for (int i = 1; i <= cnt + 4; i++)
    {
        int u = edge[i].from, v = edge[i].to, w = edge[i].w;
        if (dis[1][u] + w + dis[2][v] == dis[1][s[2]])
        {
            if (dis[3][u] + w + dis[4][v] == dis[3][s[4]] || dis[3][v] + w + dis[4][u] == dis[4][s[3]])
            {
                add0(u, v, w, 1);
            }
            else
            {
                add0(u, v, w, 0);
            }
            in[v]++;
        }
    }
}
int dp[N];
void tp()
{
    queue<int> q;
    q.push(s[1]);
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        for (int i = head0[u]; i; i = edge0[i].next)
        {
            int v = edge0[i].to, w = edge0[i].w, is = edge0[i].is;
            in[v]--;
            dp[v] = max(dp[v], dp[u] + is * w);
            if (!in[v])
            {
                q.push(v);
            }
        }
    }
}
signed main()
{
    cin >> n >> m;
    cin >> s[1] >> s[2] >> s[3] >> s[4];
    for (int i = 1; i <= m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, w);
        add(v, u, w);
    }
    dij();
    build();
    tp();
    cout << dp[s[2]];
    return 0;
}
2024/9/15 12:48
加载中...