56pt,已调崩。。。
查看原帖
56pt,已调崩。。。
735666
thinkerliu楼主2023/10/14 00:08
#include <bits/stdc++.h>

class Edge
{
public:
    int to;
    int next;
};

class Node
{
public:
    int idx;
    long long dis;

    bool operator<(Node const& other) const
    {
        return other.dis < this->dis;
    }
};

Edge edges[500050 * 2];
int  heads[500050];
bool visited[500050];
long long dis[500050];
int  n, m, k, s, p, q, nodes[500050], signs[500050], u, v;

auto cnt = 0;
void add(int u, int v)
{
    edges[++cnt].to = v;
    edges[cnt].next = heads[u];
    heads[u]        = cnt;
}

bool dfs_visited[500050];
void dfs(int now, int depth)
{
    if (depth > s)
    {
        return;
    }

    dfs_visited[now] = true;
    for (auto i = heads[now]; i; i = edges[i].next)
    {
        if (!dfs_visited[edges[i].to])
        {
            signs[edges[i].to] = 1;

            dfs(edges[i].to, depth + 1);
        }
    }
}

void dijkstra(int start)
{
    for (auto i = 1; i <= n; i++)
    {
        dis[i] = 1e18;
    }

    std::priority_queue<Node> q;

    dis[start] = 0;
    q.push(Node{start, 0});
    while (!q.empty())
    {
        auto now = q.top().idx;
        q.pop();

        if (visited[now])
        {
            continue;
        }
        visited[now] = true;

        for (auto i = heads[now]; i; i = edges[i].next)
        {
            if (signs[edges[i].to] == -1)
            {
                continue;
            }

            auto dis1 = (signs[edges[i].to] == 1 ? ::q : p);
            if (edges[i].to == n)
            {
                dis1 = 0;
            }

            if (dis[edges[i].to] > dis[now] + dis1)
            {
                dis[edges[i].to] = dis[now] + dis1;

                if (!visited[edges[i].to])
                {
                    q.push(Node{edges[i].to, dis[edges[i].to]});
                }
            }
        }
    }
}

int main()
{
    std::cin >> n >> m >> k >> s;
    std::cin >> p >> q;

    for (auto i = 1; i <= k; i++)
    {
        std::cin >> nodes[i];

        signs[nodes[i]]   = -1;
        visited[nodes[i]] = true;
    }

    for (auto i = 1; i <= m; i++)
    {
        std::cin >> u >> v;

        add(u, v);
        add(v, u);
    }

    for (auto i = 1; i <= k; i++)
    {
        dfs(nodes[i], 1);
    }

    dijkstra(1);

    std::cout << dis[n] << std::endl;

    return 0;
}
2023/10/14 00:08
加载中...