codevs 1021 玛丽卡(spfa)
麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。
因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。
在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。
麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。
玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。
编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。
第一行有两个用空格隔开的数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分钟内是就能通过。
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
27
这道题用spfa解的话我们先跑一遍spfa来求出最短路。在此过程中呢,我们要记录每一个点的最短路是由哪一个点走过来的(意思是没将一个点的最短距离更新,那么便将这个点的最短路来源换成当前点)。
接下来我们从点n开始往回找点
for(i=n;i!=;i=p[i])//p[i]记录的是i这个点的最短路是从哪个点走过来的
q[++c]=i;
q[++c]=;//q数组记录的是最短路上的所有点
这段代码记录了最短路上所有点
接着我们进行枚举,枚举所有最短路上的每一条路堵车时的1——n的最短路
接着求出这些路中花费时间最长的路(因为我们考虑的是最短路的最差值)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int next,z,v;
}b[];
int n,m,l[],d[],h,t,i,j,e,p[],q[],cnt,c,x,y,w,hh[],u,vv,ans;
bool dd[];
void add(int aa,int bb,int cc)
{
b[++cnt].v=bb;
b[cnt].next=hh[aa];
b[cnt].z=cc;
hh[aa]=cnt;
}
int main()
{
scanf("%d %d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&w);
add(x,y,w);add(y,x,w);//邻接表用来存边
} memset(l,0x3f,sizeof(l));//将每一条路的最短距离赋为最大值
l[]=;//起始点为点1,所以到点1的最短距离是0
x=;
while()
{
if(h>t)break;
j=hh[x];
while()
{
e=b[j].v;
if(l[x]+b[j].z<l[e]){
l[e]=l[x]+b[j].z;
p[e]=x;
if(dd[e]==false)dd[e]=true,d[++t]=e;//dd数组记录的是当前点是否在队列中,如果不在就将其入队;
}
if(b[j].next==)break;
j=b[j].next;
}
dd[x]=false;
x=d[++h]; }
for(i=n;i!=;i=p[i])
q[++c]=i;
ans=;
q[++c]=;
while()
{
memset(l,0x3f,sizeof(l));
l[]=;
u=q[i];
vv=q[++i];//u,vv记录的是要堵车的路的两个点
h=;t=;
x=;
while()
{
if(h>t)break;
j=hh[x];
while()
{
e=b[j].v;
if((u==x&&vv==e)||(vv==x&&u==e))
{
if(b[j].next==)break;
j=b[j].next;
continue;
}
if(l[x]+b[j].z<l[e]){
l[e]=l[x]+b[j].z;
p[e]=x;
if(dd[e]==false)dd[e]=true,d[++t]=e;
}
if(b[j].next==)break;
j=b[j].next;
}
dd[x]=false;
x=d[++h];
}
ans=max(ans,l[n]);
if(i==c)break; //当所有最短路上的边都枚举过了就打断
}
printf("%d",ans);
return 0;
}
codevs 1021 玛丽卡(spfa)的更多相关文章
- Codevs 1021 玛丽卡
Codevs 1021 玛丽卡 题目地址:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他 ...
- Codevs 1021 玛丽卡==洛谷 P1186
时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个 ...
- Code[VS]1021 玛丽卡题解
Code[VS]1021 玛丽卡题解 SPFA Algorithm 题目传送门:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽 ...
- 1021 玛丽卡 - Wikioi
题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知 ...
- 洛谷P1186 玛丽卡 spfa+删边
洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...
- wikioi 1021 玛丽卡
链接:http://wikioi.com/problem/1021/ 这题挺有意思的,虽然比较水,但是让我想起来那次百度or腾讯的一道最大流的题目,很给力,也是对最后找边进行优化,不过这题比那题简单多 ...
- Codevs 1021 (玛丽卡)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- 玛丽卡(codevs 1021)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- #图# #SPFA# ----- codevs1021 玛丽卡
codevs1021 玛丽卡 题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多 ...
随机推荐
- Module Zero概览
返回<Module Zero学习目录> 介绍 ABP框架的设计是独立于任何数据库模式的且尽可能地使用泛型.因此,它避开了一些要求数据存储的抽象和可选的概念(如审计日志,session管理和 ...
- J2EE项目修改编码问题
一:项目编码修改 新建项目后,右键项目-->Properties-->Resource,这时可以修改编码为UTF-8. 二:JSP页面编码修改 Window --> Preferen ...
- Qt And MFC UI Layout
界面布局 起初,计算机的交互是通过输入的代码进行的, 慢慢的有了图形之后, 就开始了图形界面的交互. 目前来说还有语音交互, 视频交互等多媒体的交互. 不管哪一种交互, 最终在计算机的角度都是信号的输 ...
- 微信小程序产品定位及功能介绍
产品定位及功能介绍 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序注册 注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq ...
- 几个最常用的用来代替Div的HTML5元素
虽说html5中大多数功能性的元素如<video><canvas><audio>等还得不到当前主流浏览器的支持(主要就是指IE浏览器了),但至少那些个与布局相关的元 ...
- java.io中的System.in、 System.out和System.err
System.in, System.out, System.err这3个流同样是常见的数据来源和数据流目的地.使用最多的可能是在控制台程序里利用System.out将输出打印到控制台上. JVM启动的 ...
- 基于keepalived搭建MySQL的高可用集群
MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和 ...
- IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)
上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...
- linker command failed with exit code
转载 : http://blog.csdn.net/chengwuli125/article/details/25051741
- 将文本文件的内容存储在DataSet中的方法总结
项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作.在.NET项目中较多的会使用DataSet,DataTable进行数据的缓存. 项目中对文本文件的操作比较简单,但是如果 ...