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. flume 使用 spool source的时候字符集出错

    1. 错误所在 -- ::, (pool--thread-) [ERROR - org.apache.flume.source.SpoolDirectorySource$SpoolDirectoryR ...

  2. android访问网络--okhttp

    import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okh ...

  3. MySql 查询数据库中所有表名

    查询数据库中所有表名select table_name from information_schema.tables where table_schema='csdb' and table_type= ...

  4. iOS 初学UITableView、UITableViewCell、Xib

    注意事项: 1.一个.xib里面最多设置一个cell 2.要仔细调整自动布局,其实它不太好用 3.记得设置<UITableViewDataSource>委托 4.记得在ViewContro ...

  5. C++可能出错的小细节

    1. for(list<Geometry_line>::iterator it = G.begin(); it != G.end();) { if(IsLineCrossed(*it, l ...

  6. Java NIO之缓冲区Buffer

    Java NIO的核心部件: Buffer Channel Selector Buffer 是一个数组,但具有内部状态.如下4个索引: capacity:总容量 position:下一个要读取/写入的 ...

  7. ajaxFileUpload + lua-resty-upload 上传文件

    ajaxFileUpload下载地址 地址:http://pan.baidu.com/s/1mgJypz6 html页面 <!DOCTYPE HTML PUBLIC "-//W3C// ...

  8. lsof在运维中的应用

    场景一:文件系统使用率很高,但是找不到具体哪个文件占用了空间 原因:在unix系统中,如果有两个进程同时使用一个文件,如果其中一个进程删除了这个文件,但是这个文件此刻不会正真被释放,一直要等待引用它的 ...

  9. BZOJ2844: albus就是要第一个出场

    Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子集构成的集合. 定义映射 f ...

  10. SpringMVC异常处理机制详解[附带源码分析]

    目录 前言 重要接口和类介绍 HandlerExceptionResolver接口 AbstractHandlerExceptionResolver抽象类 AbstractHandlerMethodE ...