【luogu P1186】玛丽卡

https://www.luogu.org/problem/show?pid=1186

考虑暴力,枚举图上每一条边删去后跑Dijkstra,取M次的最大值。

仔细想想就会发现删除最短路以外的边对最短路毫无影响,于是先跑出最短路,然后枚举最短路上的每一条边删去后跑Dijkstra,取这几次的最大值。

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#define maxn 1005
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m;
struct edge
{
    int from, to, weight;
};
vector<edge> e;
vector<int> g[maxn];

bool known[maxn];
int dist[maxn], front[maxn];
typedef pair<int, int> pin;
priority_queue<pin, vector<pin>, greater<pin>> pq;
void dijkstra()
{
    for (int i = 1; i <= n; ++i)
    {
        dist[i] = inf;
        known[i] = false;
        front[i] = -1;
    }
    while (!pq.empty())
        pq.pop();
    dist[1] = 0;
    pq.push(make_pair(dist[1], 1));
    while (!pq.empty() && !known[n])
    {
        int x = pq.top().second;
        pq.pop();
        if (known[x])
            continue;
        known[x] = true;
        for (int i = 0; i < g[x].size(); i++)
        {
            edge &ed = e[g[x][i]];
            if (!known[ed.to] && dist[ed.to] > dist[x] + ed.weight)
            {
                dist[ed.to] = dist[x] + ed.weight;
                front[ed.to] = g[x][i];
                pq.push(make_pair(dist[ed.to], ed.to));
            }
        }
    }
}
vector<int> path;

int main()
{
    cin >> n >> m;
    int u, v, w;
    for (int i = 1; i <= m; i++)
    {
        cin >> u >> v >> w;
        e.push_back((edge){u, v, w});
        g[u].push_back(e.size() - 1);
        e.push_back((edge){v, u, w});
        g[v].push_back(e.size() - 1);
    }
    dijkstra();
    for (int i = front[n]; i != -1; i = front[e[i].from])
        path.push_back(i);

    int ans = dist[n];
    for (int i = 0; i < path.size(); i++)
    {
        w = e[path[i]].weight;
        e[path[i]].weight = e[path[i] ^ 1].weight = inf;
        dijkstra();
        if (dist[n] != inf)
            ans = max(ans, dist[n]);
        e[path[i]].weight = e[path[i] ^ 1].weight = w;
    }
    cout << ans;
    return 0;
}
时间: 2024-08-08 12:22:53

【luogu P1186】玛丽卡的相关文章

luogu P1186玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

luogu P1186 玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

Luogu P1186 玛丽卡 【最短路】By cellur925

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

【luogu P1186 玛丽卡】 题解

题目链接:https://www.luogu.org/problemnew/show/P1186 邻接表开大开小真的奇妙,毒瘤玩意,再您妈的见. #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1010; const int inf

P1186 玛丽卡

P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多

P2176路障与P1186玛丽卡与P1491集合位置全面胜利

P2176 [USACO14FEB]路障Roadblock P1186 玛丽卡 P1491 集合位置 怎么又做到三倍经验,五年计划都超额完成了 这几道题像极了. 想起来不难吧,要让边改变之后与原来的最短路差值最大,就把最短路上的边改了呗. 用一个队列来记录最短路上的边,然后枚举这个队列里的元素,依次改变,刷出最大值. 代码有点不好写,这次我加上注释了. 不要问我为什么变量名怎么这么长,最近沉迷代码补全. P2176的代码: #include<bits/stdc++.h> using names

洛谷 P1186 玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

洛谷P1186 玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

P1186 玛丽卡 --- 最短路

-> 题意:有n个点,m条无向边,问从1到n(或从n到1)的一个最长时间t,且满足删除任意一条边后,得到的最短路都小于等于这个时间t. 思路:可以发现只有删除最短路上的边时才会对答案有影响.因此我们枚举最短路上的每一条边,将它们删去后跑最短路,最后取max即为答案.注意删边后图要保证连通. 代码: 60pt:枚举每条边 #include<cstdio> #include<cstring> #include<algorithm> #include<queue&

luoguP1186 玛丽卡 x

P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多