本来在写别的题,但是被同学 $\text{cue}$ 到说我一眼秒,遂立刻报了 $\text{unrated}$ 去看看怎么个事。确实一眼,想加写不到 $\text{5 min}$ ,但是返回值忘记开 long long 导致调了一会,本来打算交一下洛谷题解嫖个咕值,结果写完了忘记提交审核了,呜呜呜

分层图板子题。

如果不知道什么是分层图的话可以先去做 P4568 飞行路线) (但是个人感觉本题比P4568还简单)

对于第一个操作,实际上就是每条边的边权视为 $1$,然后进行一次移动。

对于第二个操作,可以使用分层图。

考虑建立两张图,对于第 $i$ 个点,建立一个虚点,编号为 $i+n$ 。第一张图为原方向,边权为 $1$,第二张图为相反方向,边权也为 $1$ ,即对于给定的边 $(u,v)$ ,从 $u$ 到 $v$ 连接 一条边权为 $1$ 的有向边,从 $v+n$ 向 $u+n$ 连接一条边权为 $1$ 的有向边。

因为第二个操作的花费为 $x$ ,所以每个点与对应的在另一张图上的点连接一条双向边,边权为 $x$ ,即从 $i$ 向 $i+n$ 连接一条边权为 $x$ 的无向边 因为可以随时进行多次操作二,这样也就保证了可以随时在正向图和反向图之间切换。

最后答案在 $dis[n]$ 和 $dis[n+n]$ 中取最小值即为答案,因为最后到达 $n$ 点可能处于正向图的状态,也可能处于反向图的状态。

代码 ↓

#include <bits/stdc++.h>
using namespace std;

using i64 = long long;
#define endl '\n'
#define xx first
#define yy second

const int MAXN = 4e5 + 10;
struct Edge
{
    int to, next, val;
} edge[MAXN << 1];
int head[MAXN], tot = 1;

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

i64 dijkstra(int n)
{
    priority_queue<pair<i64, int>, vector<pair<i64, int>>, greater<pair<i64, int>>> que;
    vector<i64> dis(n << 1 | 1, 1e18);
    vector<bool> vis(n << 1 | 1, false);
    dis[1] = 0;
    que.push({0, 1});
    while (!que.empty())
    {
        int u = que.top().yy;
        que.pop();
        if (vis[u])
            continue;
        vis[u] = true;
        for (int i = head[u]; i; i = edge[i].next)
        {
            int v = edge[i].to;
            int w = edge[i].val;
            if (dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                que.push({dis[v], v});
            }
        }
    }
    return min(dis[n], dis[n << 1]);
}

signed main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m, x;
    cin >> n >> m >> x;
    for (int i = 1; i <= m; i++)
    {
        int u, v;
        cin >> u >> v;
        add(u, v, 1);
        add(v + n, u + n, 1);
    }
    for (int i = 1; i <= n; i++)
    {
        add(i, i + n, x);
        add(i + n, i, x);
    }
    cout << dijkstra(n) << endl;

    return 0;
}