题目描述

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

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

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

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

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

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

输入输出格式

输入格式:

第一行有两个用空格隔开的数 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. [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机

    Sevenk Love Oimaster bzoj-2780 Spoj-8093 题目大意:给定$n$个大串和$m$次询问,每次给出一个字符串$s$询问在多少个大串中出现过. 注释:$1\le n\l ...

  2. Prime Ring Problem---hdu1016(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1016 这就是一道简单的dfs  但是是我自己想起来的   必须要记录一下 #include<stdio.h ...

  3. Spring4MVC 请求参数映射和Content-type

    目录 前言 不使用注解(不传则为null) 基本数据类型和日期类型 自定义类型POJO @PathVariable注解 @RequestParam 注解 @RequestBody注解 复杂对象Arra ...

  4. Node.js+Web TWAIN,实现Web文档扫描和图像上传

      目录(?)[+] 通过Dynamic Web TWAIN SDK和Node.js的组合,只需要几行代码就可以实现在浏览器中控制扫描仪,获取图像后上传到远程服务器. 原文:Document Imag ...

  5. sublime text 3(Build 3103)最新注冊码

    原来注冊过的sublime text 3近期更新了.没想到原来的注冊码就失效了,只是我找到了最新的注冊码(Build 3103),与大家分享一下(第一个亲測可用). -– BEGIN LICENSE ...

  6. php monolog 的写日志到unix domain socket 测试终于成功

    在另外一个客户端执行 php s.php后, 通过nc -lU /tmp/tg.sck 建立的unix domain socket 有接收到消息. <?php require 'vendor/a ...

  7. UI 经常用法总结之--- UILabel UITextField (不断更新中)

    UILabel : UIView <NSCoding> 1.创建一个UILabel对象 UILabel *label = [[UILabel alloc]initWithFrame:CGR ...

  8. InfoQ中文站特供稿件:Rust编程语言的核心部件

    本文为InfoQ中文站特供稿件.首发地址为: http://www.infoq.com/cn/articles/rust-core-components .如需转载.请与InfoQ中文站联系. 原文发 ...

  9. hdoj2680 Choose the best route

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  10. cocos2dx 3.0 显示中文及乱码解决方式

    遇到此问题第一时间在脑子里面联想到android下的strings.xml来做国际化,本文就仅仅针对解析xml来实现cocos2d-x的国际化解决乱码问题. 寻找解决方法的时候在cocos2d-x的c ...