题目描述

麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。

因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。

在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。

麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。

玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。

编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

输入输出格式

输入格式:

第一行有两个用空格隔开的数 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分钟内是就能通过。

输出格式:

一行,写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。

输入输出样例

输入样例#1: 复制

5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
输出样例#1: 复制

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的更多相关文章

  1. luogu P1186 玛丽卡

    题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...

  2. 【luogu P1186 玛丽卡】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1186 邻接表开大开小真的奇妙,毒瘤玩意,再您妈的见. #include <queue> #inc ...

  3. 洛谷——P1186 玛丽卡

    P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...

  4. 洛谷 P1186 玛丽卡

    P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...

  5. 洛谷P1186 玛丽卡 spfa+删边

    洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...

  6. P1186 玛丽卡

    题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...

  7. 洛谷—— P1186 玛丽卡

    https://www.luogu.org/problem/show?pid=1186 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长 ...

  8. 洛谷P1186 玛丽卡

    题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...

  9. USACO 玛丽卡(最短路+枚举)

    USACO 玛丽卡 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市 ...

随机推荐

  1. Ubuntu 16.04安装QQ(不一定成功)

    注意1:如果是刚新装的系统,可以正常安装,但是,如果你已经装了很多软件,千万不要安装,因为会把系统上一般的依赖包和你之前装的软件全部卸载掉!甚至将桌面Dock都会卸载!最终只能重装Ubuntu解决. ...

  2. nexus-3本地下载jar的settipng.xml配置

    打开maven安装目录下的setting.xml <servers> <server> <id>nexus</id> <username>a ...

  3. Meteor事件

    使用事件是非常简单的.我们将学习如何使用tag,class 和id作为事件选择器. 让我们创建HTML模板三大要素.第一个是 p 标签,第二个是 myClass 类,最后一个是myId. meteor ...

  4. Meteor模板

    Meteor模板使用三个顶级标签.前两个是 head 和 body 标签.这些标签和在普通的HTML中做的工作一样.第三个标签 template.这是我们将HTML连接到JavaScript的地方. ...

  5. hash_map与unordered_map区别

    http://blog.csdn.net/blues1021/article/details/45054159

  6. Office EXCEL 2010如何启用宏编辑器,打开VB编辑器

    文件-选项-主选项卡,勾选开发工具 然后在开发工具中找到Visual Basic编辑器,打开代码

  7. CodeForces 404 Marathon ( 浮点数取模 -- 模拟 )

    B. Marathon time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. 快看Sample代码,速学Swift语言(2)-基础介绍 快看Sample代码,速学Swift语言(1)-语法速览

    快看Sample代码,速学Swift语言(2)-基础介绍 Swift语言是一个新的编程语言,用于iOS, macOS, watchOS, 和 tvOS的开发,不过Swift很多部分内容,我们可以从C或 ...

  9. STL源代码剖析——STL算法之set集合算法

    前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...

  10. 设置ArcGIS的数据源

    我从别的地方拿到一份现成的地图文档(*.mxd),在该服务器上运行得好地地,图文并茂,但用我自己机器的arcMap打开就一片空白,啥都没有. 看左边的各个图层目录,图标上都有个粉红色的惊叹号,醒悟过来 ...