zzuli 2179: 紧急营救(有一条边权值可变为0的最短路)

题目链接

Description

冷锋在非洲完成任务后回到了狼牙特种作战部队。我们知道在战狼二结尾,冷锋正在北极执行任务,而部队发现了龙小云在c国的消息,让冷锋尽快赶往c国。我们知道现在地球上共有n个国家和地区,编号分别为1,2,3…n。国家与国家之间的可能通航班(可能不止一次),也可能没有通航班。共有m次航班,冷锋已经知道了这m次航班的信息(起点 终点,时间)北极的编号是1,c国的编号是n。
而冷峰身为超级英雄一样的的存在,他有一次将航班的时间降为零的能力。
Input

样例数t(t<=10),接下来又t组样例。 每组样例先输入n , m(n<=1000 , m<=n*(n-1)/2)。

下面m行航班的信息,分别为start , end , time(time <= 100000).
Output

对每组样例,输出冷锋到达c国的最短时间,若不能到达输出 “Impossible”。
Sample Input

3
3 1
1 2 1
4 3
1 2 4
2 3 1
2 4 4
3 3
1 2 100000
2 3 1
1 3 2
Sample Output

Impossible
4
0

真的是不想说,这出题人语文怕是白学了,题目描述路线是航班,还有起点,终点,按理说是有向图,然而这个题竟然是无向图,(鉴于出题人已经修改题面,这里就不吐槽这么狠了。)

思路就是先跑出起点1到其他任意点的距离存到dis2里面,然后再跑一下n到其他任意点的距离存到dis1里面,然后再枚举每条边,判断把这条边的权值置为0,是否能让结果更小,由于是无向图,所以对于u-v这条边,res = min(res,dis1[u]+dis2[v],dis1[v]+dis2[u]);

这题还是非常好的,开阔思路,如果这是有向图的话,我们的做法就是同样先跑出1到其他任意点的距离存到dis2里面,然后再把边反向存一下,再跑出任意一个点到n的距离,然后再枚举每条u-v边,即
res = min(res,dis2[u]+dis1[v]);

题目代码如下:

#include<bits/stdc++.h>

using namespace std;
const int MAX_V = 1010;
const int MAX_E = 500010;
const int INF = 0x3f3f3f3f;
int x[MAX_E],y[MAX_E],z[MAX_E];
int dis1[MAX_V],dis2[MAX_V];
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值