1379 Toll Management (两次最短路)

题意

要求有向图上一点到另一点的长度不超过p的最短路上的最长的边最长是多少。

分析

不能单纯的跑一边或者两边最短路,可能最短路的情况下边不是最大的。

反向建立图,由终点和起点做两次最短路,然后枚举每一条边,找出最长的边,且加上这条边后,由起点到终点的长度不大于p。

这里最短路可以用各种方法,不想写优先队列。用了bellman-ford

代码

 1 #define rep(x,y,z) for(int x=y;x<z;x++)
 2 #define drep(x,y,z) for(int x=y;x>=z;x--)
 3 #define pb(x) push_back(x)
 4 #define mp(x,y) make_pair(x,y)
 5 #define clr(x,y) memset(x,y,sizeof(x))
 6 #define fi first
 7 #define se second
 8
 9 #include <iostream>
10 #include <stdio.h>
11 #include <string.h>
12 #include <algorithm>
13 #include <vector>
14 #include <queue>
15 using namespace std;
16
17 const int N = 1e4 + 10;
18 const int inf = 0x3f3f3f3f;
19
20 vector<pair<pair<int,int>,int> > edge[2];
21 int dis[2][N];
22
23 void init(){
24     clr(dis,inf);
25     edge[0].clear();
26     edge[1].clear();
27 }
28
29 void slove(int k , int s){
30     int size = edge[k].size();
31     dis[k][s] = 0;
32     while(1){
33         bool ok = 0;
34         rep(i,0,size){
35             int f = edge[k][i].fi.fi;
36             int r = edge[k][i].fi.se;
37             int w = edge[k][i].se;
38             //
39             if(dis[k][f] + w < dis[k][r]){
40                 dis[k][r] = dis[k][f] + w;
41                 ok = 1;
42             }
43             //
44         }
45         if(!ok) break;
46     }
47 }
48
49 void read(int m){
50     rep(i,0,m){
51         int u , v , w;
52         scanf("%d %d %d",&u,&v,&w);
53         edge[0].pb(mp(mp(u,v),w));
54         edge[1].pb(mp(mp(v,u),w));
55     }
56 }
57
58 int main(){
59     int t;
60     scanf("%d",&t);
61     rep(tt,1,t+1){
62         int n , m , s , t , p;
63         scanf("%d %d %d %d %d",&n,&m,&s,&t,&p);
64         init();
65         read(m);
66         slove(0,s);
67         slove(1,t);
68         int size = edge[0].size();
69         int ans = -1;
70         rep(i,0,size){
71             int a = edge[0][i].fi.fi;
72             int b = edge[0][i].fi.se;
73             int w = edge[0][i].se;
74             //
75             if(dis[0][a] + dis[1][b] + w <= p) ans = max(ans,w);
76             //if(dis[1][a] + dis[0][b] + w <= p) ans = max(ans,w);
77             //
78         }
79         printf("Case %d: %d\n",tt,ans);
80     }
81     return 0;
82 }
时间: 2024-11-05 06:04:47

1379 Toll Management (两次最短路)的相关文章

UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)

题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可.现在如果要让p货物到达e,那么从起点出发最少要准备多少货物?输出答案和路径(多条路径则必须输出字典序最小的).注:终点需要花费,而起点不需要. 思路:这最短路变形的不错.要逆推过来求最短路径,那么就从e出发到s的距离!只是p比较大,而且城镇还得推出前一站到底需要多少货物,既然直接计算那么麻烦,也可以一直p++直到能留下p为止就推出来了:而乡村就容易

SDUT 2930-人活着系列之开会(最短路Floyd)

人活着系列之开会 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了事业,从打工的到老板的,个个都在拼搏,奋斗了多年终于有了非凡成就,有了一笔丰富的钱财.反过来说,人若赚取了全世界又有什么益处呢?生不带来,死了你还能带去吗?金钱能买保险,但不能买生命,金钱能买药品,但不能买健康,人生在世,还是虚空呀! 在苍茫的大海上,有很多的小岛,每个人都在自己的小岛上.又到了开会的时候了,鹏哥通过飞信告知了每个人,然后大家就开

ACdream 1198 Transformers&#39; Mission(最短路)

题目地址:http://acdream.info/problem?pid=1198 比赛的时候做出的人很少...所以我也没看....其实就是一道简单的最短路...要使时间最短,那么对于每一个点来说都要最短的时间从起点走到该点,然后再用最短的时间从该点到终点,那么只要求两次最短路就行了.然后最后求两个最短路的和的最大值,即最晚到达的时间. 代码如下: #include <iostream> #include <cstdio> #include <string> #incl

[kuangbin带你飞]专题四 最短路练习

A. POJ 2387  Til the Cows Come Home 模板题. #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<string> #include<map> #include<queue> #in

BZOJ 2750: [HAOI2012]Road( 最短路 )

对于每个点都跑最短路, 然后我们得到了个DAG, 在这DAG上更新每条边的答案. 考虑e(u, v)∈DAG对答案的贡献:  假设从S到u得路径数为A[u], 从v出发到达任意点的路径数为B[v], 那么e(u, v)的答案可以加上A[u] * B[v](显然). A可以按拓扑序递推得到, B可以通过记忆化搜索得到, 都是O(m). 所以总时间复杂度O(nmlogn + nm) -----------------------------------------------------------

HDU2833 最短路 floyd

WuKong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1800    Accepted Submission(s): 670 Problem Description Liyuan wanted to rewrite the famous book "Journey to the West" ("Xi You J

hdu 5521 最短路

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1656    Accepted Submission(s): 515 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Joh

【NOIP模拟赛(六)】花园的守护之神(greendam)-最短路-最大流最小割

Problem Greemdam 题目大意 给一个图$G=(V,E)$,求要使这个图的最短路增长所需要增加的最小权值的值. Solution 既然是要求这个玩意儿,我们可以排除除了最短路以外的所有路径,因为这些是无用的. 对于每一条最短路路径,如果这条路径与任意一个最短路路径有相同的一条边, 那我们只需要在这条边权值加一就可以保证这两个最短路都增加了. 所以我们转化为求不相交边的最短路路径数, 其实就是这个图的最小割. 我们给最短路的图每个边附权值为1(因为前权值是无用的), 跑一遍最大流即可.

zzuli 2179 最短路

2179: 紧急营救 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 9 SubmitStatusWeb Board Description 冷锋在非洲完成任务后回到了狼牙特种作战部队.我们知道在战狼二结尾,冷锋正在北极执行任务,而部队发现了龙小云在c国的消息,让冷锋尽快赶往c国.我们知道现在地球上共有n个国家和地区,编号分别为1,2,3...n.国家与国家之间的可能通航班(可能不止一次),也可能没有通航班.共有m次航班,冷锋