zoukankan      html  css  js  c++  java
  • UVA-12661 Funny Car Racing (dijkstra)

    题目大意:一张有向图,问从起点到终点的最快时间。不过边有点特殊,从u到v的边没开放a秒就关闭b秒。

    题目分析:dijkstra算法即可。在从u走到v的时候要注意一下时间。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<queue>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    const int INF=1<<30;
    struct Edge
    {
        int u,v,a,b,t,nxt;
    };
    Edge e[100005];
    int n,m,s,ee,head[305],cnt,d[305];
    
    void add(int u,int v,int a,int b,int t)
    {
        e[cnt].v=v,e[cnt].a=a,e[cnt].b=b,e[cnt].t=t;
        e[cnt].nxt=head[u],head[u]=cnt++;
    }
    
    void dijkstra()
    {
        fill(d,d+n+1,INF);
        queue<int>q;
        d[s]=0;
        q.push(s);
        while(!q.empty())
        {
            int fr=q.front();
            q.pop();
            for(int i=head[fr];i!=-1;i=e[i].nxt){
                int to=e[i].v;
                int time=(d[fr]%(e[i].a+e[i].b))+e[i].t;
                if(time>e[i].a)
                    time=(e[i].a+e[i].b-d[fr]%(e[i].a+e[i].b))+e[i].t;
                else
                    time=e[i].t;
                if(d[fr]+time<d[to]){
                    d[to]=d[fr]+time;
                    q.push(to);
                }
            }
        }
    }
    
    int main()
    {
        int u,v,a,b,t,cas=0;
        while(scanf("%d%d%d%d",&n,&m,&s,&ee)==4)
        {
            cnt=0;
            memset(head,-1,sizeof(head));
            while(m--)
            {
                scanf("%d%d%d%d%d",&u,&v,&a,&b,&t);
                if(t>a)
                    continue;
                add(u,v,a,b,t);
            }
            dijkstra();
            printf("Case %d: %d
    ",++cas,d[ee]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    javascript对象继承的实现
    浏览器兼容问题汇总<转>
    DOM笔记
    Ajax日记
    学习态度
    项目1
    导航项目-整体布局
    有关布局
    导航项目开始
    windows 服务 定时程序 跑不出数据
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4889727.html
Copyright © 2011-2022 走看看