搜索dp,背包,点击这道题,然后图论解决......

题目可以抽象成每一个点 i,i+1之间都有度数为1的边连接,在此基础上还额外给出了其它度数为1的边

套dijkstra模板即可

using namespace std;
const int N = 1e3 + 10;
const int inf = 2e30 - 1;
typedef pair<int, int> PII;
int n, m, root;
vector<pair<int, int>> g[N];
int dis[N];
bool vis[N];
void dijkstra()
{
    for (int i = 1; i <= n; i++)
    {
        dis[i] = inf;
    }
    dis[root] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> qu;
    qu.push({dis[root], root});
    while (qu.size())
    {
        int u = qu.top().second;
        qu.pop();
        if (vis[u])
        {
            continue;
        }
        vis[u] = true;
        for (auto [v, w] : g[u])
        {
            if (dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                qu.push({dis[v], v});
            }
        }
    }
}
int main()
{
    cin >> n >> m ;
    root=0;
    for (int i = 1; i <= m; i++)
    {
        int u, v, w;
        cin >> u >> v ;
        w=1;
        g[u].push_back({v, w});
    }
    for (int i=0;i<=n;i++)
    {
        g[i].push_back({i+1,1});
        g[i+1].push_back({i,1});
    }
    dijkstra();
   cout<<dis[n];
}

纪念第一篇题解