求助,蒟蒻对着题解写都写不出来
查看原帖
求助,蒟蒻对着题解写都写不出来
71956
dustbin1415楼主2021/9/13 20:41

RT,参照的题解(对着手打的)

#include <bits/stdc++.h>
using namespace std;
struct Edge
{
    int next, to;
    double w;
};

struct Graph
{
    int tot, head[50005];
    Edge edge[200005];
    void add(int x, int y, double z)
    {
        edge[++tot] = (Edge){head[x], y, z};
        head[x] = tot;
    }
} G, R;

int n, m, ans = 0;
double E;

struct Node
{
    int No;
    double dis;
    friend bool operator<(Node x, Node y)
    {
        return x.dis > y.dis;
    }
};

int vis[50005], fa[50005];
double dis[50005];

//标准的迪杰斯特拉
void dijkstra()
{
    priority_queue<Node> que;
    que.push((Node){n, 0});
    memset(dis, 127, sizeof(dis));
    dis[n] = 0;
    while (!que.empty())
    {
        Node u = que.top();
        que.pop();
        if (vis[u.No])
            continue;
        vis[u.No] = 1;
        for (int i = R.head[u.No]; i; i = R.edge[i].next)
        {
            Node v = (Node){R.edge[i].to, u.dis + R.edge[i].w};
            if (dis[v.No] > v.dis)
                dis[v.No] = v.dis, fa[v.No] = i, que.push(v);
        }
    }
}

int seq[50005], rt[50005];
bool cmp(int x, int y)
{
    return dis[x] < dis[y];
}

struct heap
{
    int left_son, right_son, dist, father;
    double value;
} tree[21 * 50005];

int cnt = 0;

int heap_add(int f, double value)
{
    int k = ++cnt;
    tree[k].left_son = tree[k].right_son = tree[k].dist = 0,
    tree[k].father = f,
    tree[k].value = value;
    return k;
}

int heap_merge(int x, int y)
{
    if (!x || !y)
        return x + y;
    if (tree[x].value - tree[y].value > 0)
        swap(x, y);
    int k = ++cnt;
    tree[k] = tree[x];
    tree[k].right_son = heap_merge(tree[k].right_son, y);
    if (tree[tree[k].left_son].dist < tree[tree[k].right_son].dist)
        swap(tree[k].left_son, tree[k].right_son);
    tree[k].dist = tree[tree[k].right_son].dist + 1;
    return k;
}

struct ing
{
    int x;
    double ans;
    friend bool operator<(ing x, ing y)
    {
        return x.ans > y.ans;
    }
};

int main()
{
    scanf("%d %d %lf", &n, &m, &E);
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        double z;
        scanf("%d %d %lf", &x, &y, &z);
        if (x == n)
        {
            i--, m--;
            continue;
        }
        G.add(x, y, z);
        R.add(y, x, z);
    }

    dijkstra();

    for (int i = 1; i <= n; i++)
        seq[i] = i;
    sort(seq + 1, seq + n + 1, cmp);

    tree[0].dist = -1;
    for (int i = 1; i <= n; i++)
    {
        int u = seq[i];
        for (int j = G.head[u]; j; j = G.edge[j].next)
            if (fa[u] != j)
                rt[u] = heap_merge(rt[u], heap_add(G.edge[j].to, G.edge[j].w + dis[G.edge[j].to] - dis[u]));
        rt[u] = heap_merge(rt[u], rt[G.edge[fa[u]].to]);
    }

    priority_queue<ing> que;
    if (E - dis[1] < 0)
    {
        printf("0\n");
        return 0;
    }
    E -= dis[1], ans++;
    if (rt[1])
        que.push((ing){rt[1], tree[rt[1]].value});
    while (!que.empty())
    {
        ing u = que.top();
        if (E - (u.ans + dis[1]) < 0)
            break;
        E -= u.ans + dis[1], ans++;
        if (tree[u.x].left_son)
            que.push((ing){tree[u.x].left_son, u.ans - tree[u.x].value + tree[tree[u.x].left_son].value});
        if (tree[u.x].right_son)
            que.push((ing){tree[u.x].right_son, u.ans - tree[u.x].value + tree[tree[u.x].right_son].value});
        if (rt[tree[u.x].father])
            que.push((ing){rt[tree[u.x].father], u.ans + tree[rt[tree[u.x].father]].value});
    }

    printf("%d\n", ans);

    return 0;
}

#3、#4、#6 AC
#13 MLE 其余全WA
求大佬救救我 orz

2021/9/13 20:41
加载中...