UVA 12661 Funny Car Racing 有趣的赛车比赛(单源最短路,SSSP,变形)

题意:赛道有n个交叉点,和m条单向路径(有重边),每条路都是周期性关闭的,且通过仍需一段时间。在比赛开始时,所有道路刚好打开,选择进入该道路必须满足“在打开的时间段进入,在关闭之前出来”,即不可在路上逗留,但是可以在交叉点逗留。问到达终点的时间要多少?

思路:最短路,而且正权,用Dijkstra+优先队列够了。主要的难点在计算是否可以进入该路段,画图清晰点。

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define pii pair<int,int>
 4 #define INF 0x7f7f7f7f
 5 using namespace std;
 6 const int N=50000+100;
 7 vector<int> vect[320];
 8
 9 struct node
10 {
11     int from;
12     int to;
13     int a;
14     int b;
15     int len;
16
17 }edge[N];
18 int edge_cnt;
19
20 void add_node(int u,int v,int a,int b,int t)
21 {
22     edge[edge_cnt].from=u;
23     edge[edge_cnt].to=v;
24     edge[edge_cnt].a=a;
25     edge[edge_cnt].b=b;
26     edge[edge_cnt].len=t;
27     vect[u].push_back(edge_cnt++);
28 }
29
30 int dis[320];
31 bool vis[320];
32
33 int Dijkstra(int s,int e)
34 {
35     memset(vis,0,sizeof(vis));
36     memset(dis,0x7f,sizeof(dis));
37     priority_queue<pii, vector<pii>, greater<pii> > que;
38     que.push(make_pair(0,s));
39     dis[s]=0;
40
41     while(!que.empty())     //每次用一个点来更新别人
42     {
43         int x=que.top().second; que.pop();
44         if(vis[x])  continue;   //遍历过
45         vis[x]=1;
46         for(int i=0; i<vect[x].size(); i++)
47         {
48             node e=edge[vect[x][i]];
49             if( dis[x]%(e.a+e.b)+e.len<=e.a
50                 && dis[e.to]>dis[x]+e.len )  //在可通过时间段
51             {
52                 dis[e.to]=dis[x]+e.len;
53                 que.push(make_pair(dis[e.to],e.to));
54             }
55             else if( dis[e.to]>dis[x]+e.len+ (e.a+e.b-dis[x]%(e.a+e.b))  )    //要等待
56             {
57                 dis[e.to]=dis[x]+e.len+ (e.a+e.b-dis[x]%(e.a+e.b)) ;
58                 que.push(make_pair(dis[e.to],e.to));
59             }
60         }
61     }
62     return dis[e];
63 }
64
65
66
67 int main()
68 {
69
70     freopen("input.txt", "r", stdin);
71
72     int n, m, s, t, u, v, a, b, tt, j=0;
73     while(~scanf("%d%d%d%d",&n,&m,&s,&t))
74     {
75         for(int i=0; i<=n; i++) vect[i].clear();
76         memset(edge,0,sizeof(edge));
77         edge_cnt=0;
78
79         for(int i=0; i<m; i++)
80         {
81             scanf("%d %d %d %d %d", &u, &v, &a, &b, &tt );
82             if(a>=tt)   add_node(u, v, a, b, tt);//去掉废路
83         }
84         printf("Case %d: %d\n", ++j, Dijkstra(s,t));
85     }
86     return 0;
87 }

AC代码

时间: 2024-09-30 16:22:42

UVA 12661 Funny Car Racing 有趣的赛车比赛(单源最短路,SSSP,变形)的相关文章

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

uva 10099 The Tourist Guide(单源最短路/spfa/dijkstra)

题目: 链接:点击打开链接 题意: 思路: 代码: #include <iostream> #include <cstring> #include <cstdio> using namespace std; int map[101][101]; void floyd(int n) { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) map[i][j] = m

UVa 12661 (单源最短路) Funny Car Racing

题意: 有一个赛车跑道,可以看做一个加权有向图.每个跑道(有向边)还有一个特点就是,会周期性地打开a秒,然后关闭b秒.只有在赛车进入一直到出来,该跑道一直处于打开状态,赛车才能通过. 开始时所有跑道处于刚打开的状态,求从起点到终点的最短时间. 分析: 设d[i]为起点到节点i的最短时间. 和普通的单源最短路问题一样,只不过在进行松弛操作的时候分两种情况.松弛的前提是,赛道打开的时间不短于赛车通过的时间. 赛车从进入直到出跑道,一直是打开状态.则d[v] = min(d[v], d[u] + t)

UVa 12661 - Funny Car Racing(Dijkstra)

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4399 题意: 在一个赛车比赛中,赛道有n(n≤300)个路口和m(m≤50000)条单向道路.有趣的是:每条路都是周期性关闭的.每条路用5个整数u, v, a, b, t表示(1≤u,v≤n,1≤a,b,t≤1e5),表示起点是u,终点是v,通过时间为t秒.另外,这条路会打开a秒,

[题解]UVa 12661 Funny Car Racing - spfa

很简单的一道最短路问题.分情况处理赛道的打开和关闭. Code 1 /** 2 * UVa 3 * Problem#12661 4 * Accepted 5 * Time:50ms 6 */ 7 #include<iostream> 8 #include<fstream> 9 #include<sstream> 10 #include<cstdio> 11 #include<cstdlib> 12 #include<cstring>

UVA 12661 Funny Car Racing

E - Funny Car Racing Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu There is a funny car racing in a city with n junctions and m directed roads. The funny part is: each road is open and closed periodically. Each road is associ

UvA 12661 Funny Car Racing (最短路)

There is a funny car racing in a city with n junctions and m directed roads.The funny part is: each road is open and closed periodically. Each road is associate with twointegers (a; b), that means the road will be open for a seconds, then closed for

UVa 12661 Funny Car Racing【 dijkstra 】

题意:给出n个点,m条路,每条路用5个整数表示u,v,a,b,t u表示这条路的起点,v表示终点,a表示打开时间,b表示关闭时间,t表示通过这条道路需要的时间 看的紫书,因为边权不再仅仅是路上的时间,还需要处理一下是否需要等待 如果不需要等待的话,这条路上的权值就为t 如果需要等待的话,这条路的权值就为t+wait 再用dijkstra就可以了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #

UVa 12661 Funny Car Racing (dijkstra)

题意:给定一个有向图,每条路有5个整数修饰,u, v, a, b, t,表示起点为u,终点为v,打开时间a,关闭时间为b,通过时间为t,打开关闭是交替进行的, 问你从s到t最短时间是多少. 析:使用dijkstra算法,从每个结点出发,求最短路,并维护时间的最小值,这个可以用优先队列,然后考虑能不能通过这条路,如果t<a,可以在输入时处理. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include