题目描述

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

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

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

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

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

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

输入输出格式

输入格式:

第一行有两个用空格隔开的数 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. Construct Binary Tree from Preorder and Inorder Traversal (DFS,参考)

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  2. Wannafly模拟赛2 B river(拉格朗日乘数法)

    题目 https://www.nowcoder.com/acm/contest/4/B题意 有n条南北流向的河并列排着,水流速度是v,现在你需要从西岸游到东岸,总共T个时间,你的游泳速度是u,问东岸的 ...

  3. java 定时备份数据库

    原文:http://www.open-open.com/code/view/1447490829678 /** 操作数据库 */ public class BackupDb { public Stri ...

  4. 【c++】多重继承与虚继承

    派生类的构造函数初始化列表将实参分别传递给每个直接基类,其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始化列表中基类的顺序无关. 类型转换与多个基类 编译器不会在派生类向基 ...

  5. Desert King (poj 2728 最优比率生成树 0-1分数规划)

    Language: Default Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22113   A ...

  6. [转]JAVA对象容器

    要用Java实现记事本的功能.首先列出记事本所需功能: 可以添加记录(字符串): 可以获得记录条数: 可以删除其中某一条记录: 可以获得指定第几条的记录: 可以列出所有的记录. 如果这个记事本是某个大 ...

  7. Linux 下使用 Sar 简介

    Linux 下使用 Sar 简介 提交 我的留言 加载中 已留言 介绍 Sar 最早是实现在 Salaris Unix 系统里,后来移植到了大部分其他的 Unix 系统(如AIX,HP-UX等).Li ...

  8. Deepin-添加path

    以管理员权限添加path(Debian系列) sudo gedit /etc/profile 添加path路径格式是: export PATH=”$PATH:your path1:your path2 ...

  9. 【Android数据存储】- File

    个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 读写本应用程序数据目录中的文件        此种方法读写的文件在/data/data/<应用程序包名>中   ...

  10. 【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群

    写在前边 在搭建Logstash多节点之前,想到就算先搭好Logstash启动会因为日志无法连接到Kafka Brokers而无限重试,所以这里先构建下Zookeeper集群管理的Kafka集群. 众 ...