CSU 1333: Funny Car Racing 最短路

题目连接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333

题意:给你一个n个顶点,m条边(每条边都有三个参数,开放时间,关闭时间,和通过这条边的时间)的有向图;

要你求从s 到 t 的最短路;dijkstra算法可解;

坑点:我用的是队列优化+Vector存储每条边; 在每次调用dijkstra后,必须初始化邻接表,在这个地方坑了好久,这是第二次了,以后记住 如果用vector就要初始化~

附上代码:

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
const int INF=999999999;
using namespace std;
typedef pair<int ,int > P;
int n,m,s,t;
struct edge
{
  int to;
  int open;
  int close;
  int cost;
};
vector<edge>G[330];
int d[330];
void init()
{
  for(int i=0;i<330;i++)G[i].clear();
}
void dijkstra()
{
  priority_queue<P,vector<P>,greater<P> >que;
  for(int i=0;i<320;i++)d[i]=INF;
  d[s]=0;
  que.push(P(0,s));
  while(!que.empty())
  {
    P p=que.top();
        que.pop();
    int v=p.second;
    if(d[v]<p.first)continue;
    for(int i=0;i<G[v].size();i++)
    {
      edge e=G[v][i];
      int tmp=p.first,mod=e.open+e.close;
      int re=tmp%mod;
      if(re<e.open&&e.open-re>=e.cost)
      {
        if(d[e.to]>tmp+e.cost)
        {
            d[e.to]=tmp+e.cost;
            que.push(P(d[e.to],e.to));
        }
      }
      else if(e.open>=e.cost)
      {
        if(d[e.to]>tmp+e.cost+mod-re)
        {
           d[e.to]=tmp+e.cost+mod-re;
           que.push(P(d[e.to],e.to));
        }
      }
    }
  }
}

int main()
{
  int test=1;
  while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF)
  {
    for(int i=0;i<m;i++)
    {
      int u,v,a,b,t1;
      scanf("%d%d%d%d%d",&u,&v,&a,&b,&t1);

      edge e;
      e.to=v;
      e.open=a;
      e.close=b;
      e.cost=t1;
      G[u].push_back(e);
    }

    dijkstra();
      init();
    printf("Case %d: %d\n",test++,d[t]);

  }
  return 0;
}
时间: 2024-10-12 08:24:29

CSU 1333: Funny Car Racing 最短路的相关文章

CSU 1333: Funny Car Racing(SPFA)13年省赛题

1333: Funny Car Racing Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 482  Solved: 116 [Submit][Status][Web Board] Description 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 clos

CSU 1333 Funny Car Racing (最短路)

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333 解题报告:一个图里面有n个点和m条单向边,注意是单向边,然后每条路开a秒关闭b秒,问从s点到t点的最短时间.一个简单的最短路稍微变了一下. 卡了很久就因为没看到边是单向边,无语.可以用队列优化. 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algor

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 two integers (a, b), that means the road will be open for a seconds, then closed

CSU 1312 CX and girls (最短路)

1321: CX and girls Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 432  Solved: 124[Submit][Status][Web Board] Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好.现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的数量,每条边的长度.请你求出CX以最短路径赶到教室最多能看到多少学妹. Inpu

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

UVa12661 Funny Car Racing (最短路)

链接:http://vjudge.net/problem/UVA-12661 分析:带权图最短路.仍然调用标准的Dijkstra算法,只是在松弛操作时需要分情况讨论. 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 300 + 5; 8 9 struct Edg

CSU 1307 最短路+二分

题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或者dijkstla()中计算a到b的最短距离,每次都保证只经过边小于mid值的路径 1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 #incl

【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci(Ci<=109),每条边有一个耗时,如果乘Ci号线地铁到达一个节点换乘Cj号线地铁离开,还需要花费|Ci-Cj|时间. 求1到n的最小花费时间. 题目思路: [最短路][STL] d[u][Ci]表示从1到u,最后一条地铁是Ci号线的最小耗时.按照边做,每条边枚举上一个是从哪一条地铁坐过来的,更新答案

csu - 1659 Graph Center(最短路)

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1659 题意是找一个图的中心,图的中心定义是某一个点到其他点的最大距离最小,如果有多个排序输出. 注意这里大到其他点的距离是找一个最短的距离,那么就转化成了最短路的问题,求出每个点与其它点的最大距离, 保存并且求出最大距离中的最小距离,然后判断有几个点满足条件输出即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <