Luogu P1186 玛丽卡 【最短路】By cellur925
题目描述
麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。
因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。
在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。
麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。
玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。
编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。
输入输出格式
输入格式:
第一行有两个用空格隔开的数 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 两A海星...
题意说的繁复冗杂,看了很久才明白意思。
一句话题意:

于是就想:既然每次只有一条路堵车,那我们就可以枚举会堵车的路,把它删去,更新更大的答案。略微算了一下:复杂度可能要爆炸了。于是又
想:那这些删的边应该在1到n的最短路上吧,想了想觉得不太好写呀,于是去肝暴力删每个边的算法。
搞一搞就交,果不其然50分,TLE了5个点,我觉得布星。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxn 1200 using namespace std;
typedef long long ll; int n,m,tot;
int head[maxn];
ll ans,dis[maxn];
bool flag[],vis[maxn];
struct node{
int val,to,next;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].val=z;
edge[tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void spfa()
{
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
queue<int>q;
q.push(),vis[]=,dis[]=;
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[x]+edge[i].val&&!flag[i])
{
dis[v]=dis[x]+edge[i].val;
if(!vis[v]) q.push(v),vis[v]=;
}
}
}
if(dis[n]>ans) ans=dis[n];
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=;i<=tot;i++)
flag[i]=,spfa(),flag[i]=;
printf("%lld",ans);
return ;
}
怎么记录最短路上的边呢?没忍住看了题解。其实还是很简单啦,因为是单源最短路,满足最优子结构性(所有最短路都满足),起点确定为1,而我们在跑最短路的时候松弛那一下就可以记录通往每个点的最优边序号(邻接表中)。最后我们从终点倒着跑,每次去掉最短路上的一条边,就可以枚举出最佳答案。
Tips:参照gay涛的做法,我们删边就可以把这条边的权值赋为无穷大,跑完后再修复,这是个不错的方法。
code
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxn 1200 using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f; int n,m,tot;
int head[maxn],pre[];
ll ans,dis[maxn];
bool flag[],vis[maxn];
struct node{
int val,to,next,last;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].val=z;
edge[tot].last=x;
edge[tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void spfa_pre()
{
memset(dis,0x3f,sizeof(dis));
queue<int>q;
q.push(),vis[]=,dis[]=;
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[x]+edge[i].val)
{
dis[v]=dis[x]+edge[i].val;
pre[v]=i;
if(!vis[v]) q.push(v),vis[v]=;
}
}
}
} void spfa_update()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
queue<int>q;
q.push(),vis[]=,dis[]=;
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[x]+edge[i].val)
{
dis[v]=dis[x]+edge[i].val;
pre[v]=i;
if(!vis[v]) q.push(v),vis[v]=;
}
}
}
if(dis[n]>ans) ans=dis[n];
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
spfa_pre();
for(int i=pre[n];i;i=pre[edge[i].last])
{
int tmp=edge[i].val;
edge[i].val=inf;
spfa_update();
edge[i].val=tmp;
}
printf("%lld",ans);
return ;
}
*Update:这几天想要是最短路条数不止一条怎么办qwq。今天重看题面发现两点间最多有1条路径Qwq
Luogu P1186 玛丽卡 【最短路】By cellur925的更多相关文章
- luogu P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- 【luogu P1186 玛丽卡】 题解
题目链接:https://www.luogu.org/problemnew/show/P1186 邻接表开大开小真的奇妙,毒瘤玩意,再您妈的见. #include <queue> #inc ...
- 洛谷——P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- 洛谷 P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- 洛谷P1186 玛丽卡 spfa+删边
洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...
- P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- 洛谷—— P1186 玛丽卡
https://www.luogu.org/problem/show?pid=1186 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长 ...
- 洛谷P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- USACO 玛丽卡(最短路+枚举)
USACO 玛丽卡 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市 ...
随机推荐
- Codeforces 938G(cdq分治+可撤销并查集+线性基)
题意: 有一个无向连通图,支持三个操作: 1 x y d : 新建一条x和y的无向边,长度为d 2 x y :删除x和y之间的无向边 3 x y :询问x到y的所有路径中(可以绕环)最短的 ...
- 【永久激活,视频教程,超级详细】IntelliJ idea 2018.3安装+激活+汉化
简介 IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构. ...
- jq自定义裁剪,代码超级简单,易修改
1.自定义宽高效果 1.html 代码 index.html <!DOCTYPE html> <html lang="en"> <head> ...
- 解决Win7 64bit + VS2013 使用opencv时出现提“应用程序无法正常启动(0xc000007b)”错误
应用程序无法正常启动(0xc000007b) 记得以前也遇到过这样的问题:网上的解决方法就是修复什么 今天配置opencv2.4.8+vs2013的时候,发现用老版本的程序是不是都会出现这样的现象啊! ...
- influxDB系列(二)
来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ...
- [RxJS] Use `lift` to Connect a `source` to a `subscriber` in RxJS
The lift method on each source hides away the internals of RxJS so you can simply connect a source t ...
- 暴力破解unix/linux平台上采用crypt加密的口令
# coding=utf-8 ''' 暴力破解crypt模块加密的密码 ''' import crypt import optparse usage = 'Usage: %prog [optinos] ...
- JavaGUI应用程序打包及数字签名
JavaGUI应用程序部署 JavaGUI程序发布分类: a.Applet:可以嵌入到浏览器中,通过网页的方式展示给用户 b.application :有两种发布方式 :打包成jar包通过bat的方式 ...
- Chapter1-data access reloaded:Entity Framework(下)
1.4 Delving deep into object/relational differences 深入挖掘对象关系的不同 理解面向对象和关系世界的不同是重要的,因为他会影响你设计一个对象模型或者 ...
- 6.游戏特别离不开脚本(3)-JS脚本操作java(2)(直接解析JS公式,并非完整JS文件或者函数)
在游戏中可以考虑数据由javabean保存,逻辑方法由JS提供. public class Bean4JS { private int id; private String name; private ...