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. Java NIO示例:多人网络聊天室

    一个多客户端聊天室,支持多客户端聊天,有如下功能: 功能1: 客户端通过Java NIO连接到服务端,支持多客户端的连接 功能2:客户端初次连接时,服务端提示输入昵称,如果昵称已经有人使用,提示重新输 ...

  2. HDU5772 String problem(最大权闭合子图)

    题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...

  3. JNDI 配置:JBoss + MySQL

    一.JNDI 名词解释 JNDI 是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.从一开始就一直是 Java 2 平台企业版(JE ...

  4. BZOJ3414 : Poi2013 Inspector

    二分答案,没有出现过的时刻没有用,可以进行离散化. 首先如果某个时刻出现多个人数,那么肯定矛盾. 然后按时间依次考虑,维护: $t$:剩余可选人数. $s$:现在必定有的人数. $cl$:往左延伸的人 ...

  5. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  6. glup Browsersync

    http://www.browsersync.cn/#installhttp://www.browsersync.cn/docs/gulp/http://www.mamicode.com/info-d ...

  7. node.js的request模块

    request模块让http请求变的更加简单.最简单的一个示例: 1: var request = require('request'); 2:  3: request('http://www.goo ...

  8. 【软件工程实践一】git使用心得

    第一次软工实践,我们需要做的是学习如何使用github,并将本地库的文件添加到远程库中,以下是我进行实践的工程. [一.git的安装及准备工作] 首先从http://msysgit.github.io ...

  9. 【android应用市场】android应用市场集合

    一.举例 1.酷市场 2.apkpure 国外的应用市场,可不用FQ,没有google play的一些限制 相当于google play的镜像,可以下载google play的应用 3.360手机助手 ...

  10. JAVA中保留指定小数位方法

    import java.math.BigDecimal;    import java.text.DecimalFormat;    import java.text.NumberFormat;    ...