• Funny Car Racing(最短时间)


    题目链接:http://acm.hust.edu.cn/vjudge/contest/123674#problem/H

    题目大意:每个车道会开a 分钟然后关b 分钟,一直这样循环,车通过此车道要t 分钟,可以判断出t一定不能小于a,题目会给出m组信息。让我们求s到t的最短时间。

    解题思路:求最短路径。但是比求最短路径多一点判断,即时间上的判断,我们要选择最优的时间(即总时间最小的时间)

    代码如下:有解释

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    const long long maxx=1<<30;
    const long long N=1000;
    struct home
    {
        long long v,u,a,b,c,d;
    } edg[50010];        //定义一个结构体数组,方便数据的使用与储存
    long long bb,head[N],dis[N];
    void init()
    {
        bb=0;
        memset(head,-1,sizeof(head));
        for(long long i=0;i<N;i++)
            dis[i]=maxx;
    }
    void addEdg(long long u,long long v,long long a,long long b,long long c)
    {
        edg[bb].v=v;
        edg[bb].u=head[u];
        edg[bb].a=a;
        edg[bb].b=b;
        edg[bb].c=c;
        edg[bb].d=a+b;
        head[u]=bb++;
    }
    void diji(long long s,long long t)
    {
        queue<long long>q;
        bool vis[N]={0};
        long long u,v;
        dis[s]=0;
        if(s!=t)
            q.push(s);
        while(!q.empty())//判断是否非空
        {
            u=q.front();
            q.pop();
            vis[u]=0;
            for(long long i=head[u];i!=-1;i=edg[i].u)
            {
                v=edg[i].v;
                long long tt=edg[i].a-(dis[u]%edg[i].d);
                if(tt<edg[i].c
                    tt+=edg[i].b ;
                else
                    tt=0 ;
                if(dis[v]>dis[u]+tt+edg[i].c)
                { dis[v]=dis[u]+tt+edg[i].c;
                    if(vis[v]==0&&v!=t)
                        vis[v]=1,q.push(v);
                }
            }
        }
    }
    int main()
    {
        long long n,m,s,t,u,v,a,b,c;
        long long T=1;
        while(scanf("%lld%lld%lld%lld",&n,&m,&s,&t)==4)
        {
            init();//初始化一下
            while(m--)
            {
                scanf("%lld%lld%lld%lld%lld",&u,&v,&a,&b,&c);
                if(c<=a)
                    addEdg(u,v,a,b,c);//调用构造函数
            }
            diji(s,t);
            if(dis[t]==maxx)dis[t]=-1;
            printf("Case %lld: %lld ",T++,dis[t]);
        }
        return 0;
    }

  • 相关阅读:
    C# MQTT M2MQTT
    C# MethodInvoker委托的使用
    linux打包/解压-tar
    linux挂载查看、添加与取消
    IE6、火狐不支持a:visited
    js和jquery中的触发事件
    MySQL5.7.9免安装版配置方法
    mysql数据库在Navicat Premium连接的时候出现1862错误
    mysql max_allowed_packet查询和修改
    服务器是windows时tomcat无法打印所有日志配置修改
  • 原文地址:https://www.cnblogs.com/441179572qqcom/p/5720598.html
Copyright © 2020-2023  润新知