0溢求助
查看原帖
0溢求助
338430
t1048576楼主2022/8/29 16:49

46分,除AC外输出均为0 代码:

#include <string.h>
#include <iostream>
#include <queue>
using namespace std;

typedef long long T;

class Tree
{
private:
    typedef T _T;
    static const _T NODE_MAX = 10005, EDGE_MAX = 300005;

public:
    class Edge
    {
    public:
        _T to, dis, fr;
        Edge *ne;
        Edge() { dis = 0x7fffffff; }
        Edge(_T From, _T To, Edge *Next, _T Dis)
        {
            to = To;
            fr = From;
            ne = Next;
            dis = Dis;
        }
    };
    Edge *head[NODE_MAX];
    void add(_T a, _T b, _T dis)
    {
        Edge *e = new Edge(a, b, head[a], dis);
        head[a] = e;
    }
};

class Step
{
public:
    T x, dis;
    const bool operator>(const Step &a) const { return dis > a.dis; }
};

const T NODEMX = 100005;
priority_queue<T, vector<T>, greater<T>> qu;
Tree mp, dag, dag2;
T ds[10][NODEMX];
T deg[NODEMX], len[NODEMX];
bool vis[NODEMX];

void dijk(T x, T id, T n)
{
    ds[id][x] = 0;
    qu.push(x);
    while (!qu.empty())
    {
        T u = qu.top();
        qu.pop();
        if (vis[u])
            continue;
        vis[u] = 1;
        for (Tree::Edge *e = mp.head[u]; e != nullptr; e = e->ne)
        {
            T y = e->to, w = e->dis;
            if (ds[id][y] > ds[id][u] + w)
            {
                ds[id][y] = ds[id][u] + w;
                qu.push(y);
            }
        }
    }
}

void topology(queue<T> &q, Tree tr, T n)
{
    q = queue<T>();
    for (T i = 1; i <= n; i++)
    {
        if (deg[i] <= 0)
            q.push(i);
    }
    while (!q.empty())
    {
        T x = q.front();
        q.pop();
        for (Tree::Edge *e = tr.head[x]; e != nullptr; e = e->ne)
        {
            T y = e->to, w = e->dis;
            deg[y]--;
            len[y] = max(len[y], len[x] + w);
            if (deg[y] <= 0)
                q.push(y);
        }
    }
}

int main()
{
    T n, m, x1, x2, y1, y2;
    cin >> n >> m >> x1 >> x2 >> y1 >> y2;
    for (T i = 1; i <= m; i++)
    {
        T a, b, d;
        cin >> a >> b >> d;
        mp.add(a, b, d);
        mp.add(b, a, d);
    }
    memset(ds, 0x7f, sizeof(ds));
    memset(vis, 0x00, sizeof(vis));
    dijk(x1, 1, n);
    memset(vis, 0x00, sizeof(vis));
    dijk(y1, 2, n);
    memset(vis, 0x00, sizeof(vis));
    dijk(x2, 3, n);
    memset(vis, 0x00, sizeof(vis));
    dijk(y2, 4, n);
    for (T x = 1; x <= n; x++)
    {
        for (Tree::Edge *e = mp.head[x]; e != nullptr; e = e->ne)
        {
            T y = e->to, w = e->dis;
            if (ds[1][x] + w + ds[2][y] == ds[1][y1])
            {
                if (ds[3][x] + w + ds[4][y] == ds[3][y2])
                {
                    dag.add(x, y, w);
                    deg[y]++;
                }
            }
        }
    }
    queue<T> q;
    T ans = 0;
    memset(vis, 0x00, sizeof(vis));
    topology(q, dag, n);
    for (T i = 1; i <= n; i++)
        ans = max(ans, len[i]);
    memset(deg, 0x00, sizeof(deg));
    memset(len, 0x00, sizeof(deg));
    for (T x = 1; x <= n; x++)
    {
        for (Tree::Edge *e = mp.head[x]; e != nullptr; e = e->ne)
        {
            T y = e->to, w = e->dis;
            if (ds[1][x] + w + ds[2][y] == ds[1][y1])
            {
                if (ds[4][x] + w + ds[3][y] == ds[3][y2])
                {
                    dag2.add(x, y, w);
                    deg[y]++;
                }
            }
        }
    }
    memset(vis, 0x00, sizeof(vis));
    topology(q, dag2, n);
    for (T i = 1; i <= n; i++)
        ans = max(ans, len[i]);
    cout << ans;
}
2022/8/29 16:49
加载中...