UVA - 12661 Funny Car Racing (Dijkstra算法)

题目:

思路:

把时间当做距离利用Dijkstra算法来做这个题。

前提:该结点e.c<=e.a,k = d[v]%(e.a+e.b);

当车在这个点的1处时,如果在第一个a这段时间内能够通过且更小的话,那时间就更新为d[e.to] = d[v]+e.a-k+e.c;

当车在这个点的1处时,如果在第一个a这段时间内不能通过,但等待之后再通过时间更短的话,那时间更新为d[e.to]=d[v]+e.a+e.b-k+e.to

如果在这个点的2处时,如果在等待之后通过的时间更短的话,时间更新和第二种情况一样为d[e.to]=d[v]+e.a+e.b-k+e.to

所有的边是有向边,然后用迪杰斯特拉算法解题就可以了。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1000000000
#define mod 1000000007
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;//first-距离 second-编号
const int maxn = 505;
int d[maxn];
int n,m,s,t;
struct Edge {
    int to,a,b,c;
};
vector<Edge> G[maxn*100];

void init() {
    for(int i=0; i<maxn*100; i++) {
        G[i].clear();
        if(i<maxn) {
            d[i] = inf;
        }
    }
    for(int i=0; i<m; i++) {
        int u,v,a,b,c;
        scanf("%d%d%d%d%d",&u,&v,&a,&b,&c);
        G[u].push_back(Edge{v,a,b,c});
    }
}

void Dijstra(){
    priority_queue<P,vector<P>,greater<P> > que;
    d[s] = 0;
    que.push(P(0,s));
    while(!que.empty()){
        P p = que.top();que.pop();
        int v = p.second;
       // cout<<"GG  "<<v<<endl;
        if(d[v]>p.first) continue;
        //cout<<"size: "<<G[v].size()<<endl;
        for(int i=0; i<G[v].size(); i++){
            Edge e = G[v][i];
            int k = d[v]%(e.a+e.b);
            if(k+e.c<=e.a && d[e.to]>d[v]+e.c && e.c<=e.a){
                d[e.to] = d[v]+e.c;
                que.push(P(d[e.to],e.to));
                //cout<<"Fuck!"<<endl;
            }else if(k+e.c>e.a && d[e.to]>d[v]+e.a+e.b-k+e.c && e.c<=e.a){
                d[e.to] = d[v]+e.a+e.b-k+e.c;
                que.push(P(d[e.to],e.to));
                //cout<<"Fuck!"<<endl;
            }
        }
    }
}

int main() {
   // FRE();
    int kase=0;
    while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF) {
        init();
        Dijstra();
        printf("Case %d: %d\n",++kase,d[t]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sykline/p/10412116.html

时间: 2024-11-12 09:03:36

UVA - 12661 Funny Car Racing (Dijkstra算法)的相关文章

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

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【 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 - 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 有趣的赛车比赛(单源最短路,SSSP,变形)

题意:赛道有n个交叉点,和m条单向路径(有重边),每条路都是周期性关闭的,且通过仍需一段时间.在比赛开始时,所有道路刚好打开,选择进入该道路必须满足“在打开的时间段进入,在关闭之前出来”,即不可在路上逗留,但是可以在交叉点逗留.问到达终点的时间要多少? 思路:最短路,而且正权,用Dijkstra+优先队列够了.主要的难点在计算是否可以进入该路段,画图清晰点. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair

【uva 658】It&#39;s not a Bug, it&#39;s a Feature!(图论--Dijkstra算法+二进制表示)

题意:有n个潜在的bug和m个补丁,每个补丁用长为n的字符串表示.首先输入bug数目以及补丁数目.然后就是对m 个补丁的描述,共有m行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,地一个字符串 是对软件的描述,只有软件处于该状态下才能打该补丁该字符串的每一个位置代表bug状态(-代表该位置没bug,+代 表该位置有bug,0表示该位置无论有没有bug都可打补丁).然后第二个字符串是对打上补丁后软件状态的描述 -代表该位置上的bug已经被修复,+表示该位置又引入了一个新的bug

658 - It&#39;s not a Bug, it&#39;s a Feature! (Dijkstra算法)

今天第一次系统的学习了一下最短路算法,开始刷第十一章,第一次写Dijkstra算法,出现了很多喜闻乐见的错误..而且uva上样例很水,瓢虫也很水 ,坑了我好久. 首先是对于结点的处理,我们必须要维护一个二元组,一个表示结点一个表示当前结点最短路.   因为Dijkstra算法利用了优先队列来加速算法,所以需要定义小于运算符,一开始我直接将状态装进了优先队列,显然是不对的,因为优先队列的作用就是取出当前距离最短的结点. 其次,说说最短路算法蕴含的巧妙思想: 每次从当前所有还未标记的结点中选择一个距