luogu 1186 玛丽卡
来源:互联网 发布:mac登陆远程桌面 编辑:程序博客网 时间:2024/06/03 14:53
Description
麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。
因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。
在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。
麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。
玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。
编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。
Input
第一行有两个用空格隔开的数N和M,分别表示城市的数量以及城市间道路的数量。1≤N≤1000,1≤M≤N*(N-1)/2。城市用数字1至N标识,麦克在城市1中,玛丽卡在城市N中。
接下来的M行中每行包含三个用空格隔开的数A,B和V。其中1≤A,B≤N,1≤V≤1000。这些数字表示在A和城市B中间有一条双行道,并且在V分钟内是就能通过。
Output
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。
Sample input
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
Sample Output
27
Hint
Solution :
题目中给出了
Code:
#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <cmath>#include <ctime>#include <map>#include <vector>#include <queue>#define mp make_pairusing namespace std;inline int read() { int i = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)) { i = (i << 3) + (i << 1) + ch - '0'; ch = getchar(); } return i * f;}const int MAXN = 1000 + 5;int first[MAXN], dis[MAXN], to[MAXN * MAXN], nxt[MAXN * MAXN], len[MAXN * MAXN];int tot, n, m, pre[MAXN];priority_queue<pair<int, int> > q;inline void addedge(int x, int y, int w) { nxt[++tot] = first[x]; first[x] = tot; to[tot] = y; len[tot] = w; nxt[++tot] = first[y]; first[y] = tot; to[tot] = x; len[tot] = w;}inline void dij() { memset(dis, 0x3f, sizeof(dis)); dis[1] = 0; q.push(mp(0, 1)); while(!q.empty()) { pair<int, int> u = q.top(); q.pop(); for(int i = first[u.second]; i; i = nxt[i]) if(dis[to[i]] > dis[u.second] + len[i]) { dis[to[i]] = dis[u.second] + len[i]; pre[to[i]] = i ^ 1; q.push(mp(-dis[to[i]], to[i])); } }}inline int solve() { memset(dis, 0x3f, sizeof(dis)); while(!q.empty()) q.pop(); dis[1] = 0, q.push(mp(0, 1)); while(!q.empty()) { pair<int, int> u = q.top(); q.pop(); if(u.second == n) return dis[n]; for(int i = first[u.second]; i; i = nxt[i]) if(dis[to[i]] > dis[u.second] + len[i]) { dis[to[i]] = dis[u.second] + len[i]; q.push(mp(-dis[to[i]], to[i])); } } return dis[n];}int main() { n = read(), m = read(); tot = 1; for(int i = 1; i <= m; ++i) { int x = read(), y = read(), w = read(); addedge(x, y, w); } dij(); int ans = 0; for(int i = pre[n] ;; i = pre[to[i]]) { int now = len[i]; len[i] = 0x3f3f3f3f; len[i ^ 1] = 0x3f3f3f3f; ans = max(ans, solve()); len[i] = now; len[i ^ 1] = now; if(to[i] == 1) break; } printf("%d\n", ans);}
- luogu 1186 玛丽卡
- luogu 1000超级玛丽
- 洛谷1186 玛丽卡
- 洛谷1186-玛丽卡
- 【洛谷 1186】 玛丽卡
- 洛谷1186 玛丽卡
- luogu解题报告:P1186玛丽卡【图论/最短路/堆优化dijkstra】
- 玛丽卡
- 玛丽卡
- 玛丽卡
- [练习][洛谷1186]最短路 玛丽卡
- 【最短路】玛丽卡
- wikioi 1021 玛丽卡
- 【wikioi1021】 玛丽卡
- Codevs1021玛丽卡题解
- Codevs1021 玛丽卡
- Codevs 1021 玛丽卡
- Codevs 玛丽卡
- 三星支付高达20万美元,奖励发现关键安全漏洞的人员
- UIAlertView 自动消失
- (转)"Error launching Console Application PDFLaTeX ... "的解决方法
- ubuntu -- Target filesystem doesn't have /sbin/init(Slax解决)
- 解决Android studio更新问题
- luogu 1186 玛丽卡
- 无限的未知windows 2003完整安装版V6安装教程
- 使用数据库连接池连接数据库
- 等不及iPhone 8 ,你可以先看看这一场发布会
- 按键处理及外部中断
- 网信办发布新规,以后建群也要实名制了!
- Facebook打算重新摸进中国市场,现在正悄悄地寻找办公场地
- 为了让手表更好用,苹果找人先“戴”了7年半
- 389. Find the Difference (hash&异或)