Codevs 1021 玛丽卡

题目地址:http://codevs.cn/problem/1021/

题目描述 Description

麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。

因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。

在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。

麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。

玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

输入描述 Input Description

第一行有两个用空格隔开的数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 Description

输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。

样例输入 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
  • 这道题先跑一遍SPFA,找出 点1 到 点N 最短路的路径,然后枚举这条路径上的所有边,依次将它们的权值赋为 +∞ 然后跑一遍SPFA。答案就是 Max(disN) 了。
  • 因为如果堵车那条路不在 点1 到 点N 最短路的路径 上时,最小时间应该就是 点1 到 点N 的距离。
#include <cstdio>
#include <deque>
#define INF 1000000007
int n, m;
int hu[1005], hv[1005], f[1005];
bool vis[1005];
struct edge_type
{
int u, v, w, nu, nv;
};
edge_type edge[1000005];
int dis[1005];
std::deque<int> q;
int main()
{
int x, y, z;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
edge[i].u = x;
edge[i].v = y;
edge[i].w = z;
edge[i].nu = hu[x];
edge[i].nv = hv[y];
hu[x] = i;
hv[y] = i;
}
int tmp, now, p, ans = 0, ttmp, ei;
q.clear();
for (int i = 1; i <= n; ++i)
dis[i] = INF;
dis[1] = 0;
f[1] = 0;
vis[1] = true;
q.push_back(1);
while (!q.empty())
{
now = q.front();
q.pop_front();
vis[now] = false;
p = hu[now];
while (p)
{
if (dis[edge[p].v] > dis[now] + edge[p].w)
{
dis[edge[p].v] = dis[now] + edge[p].w;
f[edge[p].v] = p;
if (!vis[edge[p].v])
{
q.push_back(edge[p].v);
vis[edge[p].v] = true;
}
}
p = edge[p].nu;
}
p = hv[now];
while (p)
{
if (dis[edge[p].u] > dis[now] + edge[p].w)
{
dis[edge[p].u] = dis[now] + edge[p].w;
f[edge[p].u] = p;
if (!vis[edge[p].u])
{
q.push_back(edge[p].u);
vis[edge[p].u] = true;
}
}
p = edge[p].nv;
}
}
ttmp = n;
ei = f[n];
while(ei)
{
tmp = edge[ei].w;
edge[ei].w = INF;
q.clear();
for (int i = 1; i <= n; ++i)
dis[i] = INF;
dis[1] = 0;
f[1] = 0;
vis[1] = true;
q.push_back(1);
while (!q.empty())
{
now = q.front();
q.pop_front();
vis[now] = false;
p = hu[now];
while (p)
{
if (dis[edge[p].v] > dis[now] + edge[p].w)
{
dis[edge[p].v] = dis[now] + edge[p].w;
f[edge[p].v] = p;
if (!vis[edge[p].v])
{
q.push_back(edge[p].v);
vis[edge[p].v] = true;
}
}
p = edge[p].nu;
}
p = hv[now];
while (p)
{
if (dis[edge[p].u] > dis[now] + edge[p].w)
{
dis[edge[p].u] = dis[now] + edge[p].w;
f[edge[p].u] = p;
if (!vis[edge[p].u])
{
q.push_back(edge[p].u);
vis[edge[p].u] = true;
}
}
p = edge[p].nv;
}
}
if (ans < dis[n])
ans = dis[n];
edge[ei].w = tmp;
ttmp = edge[ei].u ^ edge[ei].v ^ ttmp;
ei = f[ttmp];
}
printf("%d", ans);
}

Codevs 1021 玛丽卡的更多相关文章

  1. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  2. Codevs 1021 玛丽卡==洛谷 P1186

    时间限制: 2 s 空间限制: 128000 KB  题目等级 : 大师 Master  题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个 ...

  3. Code[VS]1021 玛丽卡题解

    Code[VS]1021 玛丽卡题解 SPFA Algorithm 题目传送门:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽 ...

  4. 1021 玛丽卡 - Wikioi

    题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知 ...

  5. wikioi 1021 玛丽卡

    链接:http://wikioi.com/problem/1021/ 这题挺有意思的,虽然比较水,但是让我想起来那次百度or腾讯的一道最大流的题目,很给力,也是对最后找边进行优化,不过这题比那题简单多 ...

  6. Codevs 1021 (玛丽卡)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  7. 玛丽卡(codevs 1021)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  8. codevs1021 玛丽卡

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  9. #图# #SPFA# ----- codevs1021 玛丽卡

    codevs1021 玛丽卡 题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多 ...

随机推荐

  1. 每天一个linux命令--more/less

    最近小编在和第三方调试接口,只能查日志,查询除了tail,grep,cat,之外,还有 more.less,他们的优点在于可以翻页. more最基本的指令就是按空白键(space)就往下一页显示,按  ...

  2. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  3. 阴影:box-shaw

    box-shaw:0px 0px 2px 3px while; 水平方向  垂直方向  模糊半径  模糊系数(大小)颜色

  4. Connect模块解析

    Connect模块背景 Node.js的愿望是成为一个能构建高速,可伸缩的网络应用的平台,它本身具有基于事件,异步,非阻塞,回调等特性,这在前几篇专栏中有过描述. 正是基于这样的一些特性,Node.j ...

  5. Node.js的DES加解密和MD5加密

    最基本的就是经常用的md5加密算法 代码如下 var  MD5=function (data) {        var _encrymd5 = require('crypto').createHas ...

  6. pr高的2级域名站点如何做优化?

    优化方法: 二级域名的内容建设也需要细致化 很多人认为,优化二级域名没有优化顶级域名那么多工作,只需要发发外链就可以了,这可以说是一个误区.我们的目的是要优化二级域名到首页,让用户能够看到,如果我们的 ...

  7. zabbix3.2.0beta2 监控模版

    Zabbix监控中用到了一系列模版,nginx后端检测状态 微信告警等一系列常规的服务应用监控 memcached监控模版,可以自己重新定义memcached的端口 http://files.cnbl ...

  8. 怎么控制表单placeholder属性的样式兼容各大浏览器?

    当我们使用placeholder的时候会遇到样式的控制和版本的兼容问题(但是还是只有css3支持),以至于达不到我们想要的效果,下面来看一种: 下面是css: .invalid:-moz-placeh ...

  9. WinForm 窗体属性

    WinForm - C/S 客户端     B/S 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序特点:不需要联网也可以打开使用部分功能但是现在的情况是许多功能依然需要互联网的支持 ...

  10. ACM Steps 2.1.4

    Largest prime factor   Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...