【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 = 2139062143;
struct edge{
    int len, from, to, next;
}e[1000001];
int head[maxn], dis[maxn], n, m, cnt, u, v, w, ans, s, cut[maxn][maxn], f[maxn];//f[]记录路径
bool vis[maxn], flag;
queue<int> q;
void add(int u, int v, int w)
{
    e[++cnt].from = u;
    e[cnt].len = w;
    e[cnt].to = v;
    e[cnt].next = head[u];
    head[u] = cnt;
}
int SPFA()
{
    queue<int> q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f3f3f3f,sizeof(dis));
    vis[1] = 1;
    q.push(1);
    dis[1] = 0;
    while(!q.empty())
    {
        int now = q.front();
        q.pop();
        vis[now] = 0;
        for(int i = head[now]; i ; i = e[i].next)
        {
            if(cut[now][e[i].to] == 0&&dis[e[i].to] > dis[now]+e[i].len)
            {
                if(!flag) f[e[i].to] = now;
                dis[e[i].to] = dis[now]+e[i].len;
                if(!vis[e[i].to])
                {
                    vis[e[i].to] = 1;
                    q.push(e[i].to);
                }
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(dis,0x7f,sizeof(dis));
    for(int i = 1; i <= m; i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    SPFA();
    flag = 1;
    for(int i = n; i != 1; i = f[i])
    {
        cut[f[i]][i] = 1;
        cut[i][f[i]] = 1;
        SPFA();
        cut[f[i]][i] = 0;
        cut[i][f[i]] = 0;
        ans = max(dis[n], ans);
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/MisakaAzusa/p/9212617.html

时间: 2024-10-05 23:09:12

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

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

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

luogu P1186玛丽卡

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

luogu P1186 玛丽卡

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

P1186 玛丽卡

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

Code[VS]1021 玛丽卡题解

Code[VS]1021 玛丽卡题解 SPFA Algorithm 题目传送门:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡

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

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

洛谷 P1186 玛丽卡

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

洛谷P1186 玛丽卡

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

Codevs1021玛丽卡题解

http://codevs.cn/problem/1021/ 题目大意 在一张无向图中求删去一条边后的从点1到点n的最短路的最大值. 点数≤1000,边数≤106. 题解 一开始的思路是枚举所有边,然后分别跑最短路,然后妥妥地T. 先考虑不删边的情况,那么可以跑一次最短路.(众:废话!) 然而我们的目的是把这一条最短路记录下来.实际上,要删的边都在最短路上.(否则删了一条不在最短路上的边,跑出来最短路不和没删边一样吗?) 然后就可以spfa或者dijkstra堆优化了. 实测spfa800ms+