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. BFS HDOJ 2102 A计划

    题目传送门 题意:中文题面 分析:双层BFS,之前写过类似的题.总结坑点: 1.步数小于等于T都是YES 2. 传送门的另一侧还是传送门或者墙都会死 3. 走到传送门也需要一步 #include &l ...

  2. sring mvc 返回值至jsp界面的几种方式

    Spring 通过Controller 向 View 传值的方法有以下四种 HttpServletRequest ModelAndView Map<String, Object> map ...

  3. 利用TaskCompletionSource将EAP转换成TAP

        1.原始的异步方法的调用   我们来看个简单的例子,在这里演示调用 WebClient.DownloadStringAsync 方法(这个方法不是 TAP),然后由 WebClient.Dow ...

  4. C#调用本机摄像头

    这段时间一个小项目中需要调用本机的摄像头进行拍照,网上搜集了一些资料以及解决的一些小问题,在此记录以便后续使用. 硬件环境:联想C360一体机,自带摄像头 编写环境:vs2010 语言:C# WPF ...

  5. BZOJ1481 : Navigation Game

    设$f[i][j][k]$表示从最后一行某个$H$走到$(i,j)$且在第$i$行只经过了$(i,j)$,途中经过了$k$次$F$的最小代价. $A[i][j][k]$表示从下一行$\leq i$的某 ...

  6. Issues I encountered when building Windows Store apps on a new laptop

    I took over my beloved wives samsung ativ book 9 recently as her first job granted her a brandnew su ...

  7. JavaScript进阶(二)

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...

  8. HDU 4004 The Frog's Games(二分)

    题目链接 题意理解的有些问题. #include <iostream> #include<cstdio> #include<cstring> #include< ...

  9. [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?

    [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?  总结:如果是退出编辑器 quit :如果是断开数据库连接释放资源 connect reset : ...

  10. qt编译常见错误

    一.fatal error: QWidget: 没有那个文件或目录 类似于找不到文件目录的,在.pro文件中添加 QT +=\ widgets 类似就可以编译通过