P1266 速度限制

P1266 速度限制



第一次接触这种分层spfa

类似于dp 个人理解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
    int p;
    int v;
    int l;
    int x;
};
struct que
{
    int p;
    int v;
};
queue<que>q;
node l[100000];
int h[501],t;
int pp[500][510],pv[500][510];
bool vis[500][510];
double map[500][510];
void add(int a,int b,int c,int d)
{
    l[++t].p=b;
    l[t].v=c;
    l[t].l=d;
    l[t].x=h[a];
    h[a]=t;
}
void print(int a,int b)
{
    if(a!=1)
        print(pp[a][b],pv[a][b]);
    printf("%d ",a-1);
}
int main()
{
    int n,m,end;
    scanf("%d%d%d",&n,&m,&end);
    end+=1;
    int a,b,c,d;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        a+=1;
        b+=1;
        add(a,b,c,d);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=510;j++)
            map[i][j]=0x7ffffff;
    vis[1][70]=true;
    map[1][70]=0;
    que pa,net;
    pa.p=1;
    pa.v=70;
    q.push(pa);
    while(!q.empty())
    {
        pa=q.front();
        q.pop();
        vis[pa.p][pa.v]=false;
        for(int i=h[pa.p];i;i=l[i].x)
        {
            if(l[i].v==0)
            {
                if(map[l[i].p][pa.v]>1.0*map[pa.p][pa.v]+1.0*l[i].l/pa.v)
                {
                    map[l[i].p][pa.v]=1.0*map[pa.p][pa.v]+1.0*l[i].l/pa.v;
                    pp[l[i].p][pa.v]=pa.p;
                    pv[l[i].p][pa.v]=pa.v;
                    if(!vis[l[i].p][pa.v])
                    {
                        vis[l[i].p][pa.v]=true;
                        net.p=l[i].p;
                        net.v=pa.v;
                        q.push(net);
                    }
                }
            }
            else
            {
                if(map[l[i].p][l[i].v]>1.0*map[pa.p][pa.v]+1.0*l[i].l/l[i].v)
                {
                    map[l[i].p][l[i].v]=1.0*map[pa.p][pa.v]+1.0*l[i].l/l[i].v;
                    pp[l[i].p][l[i].v]=pa.p;
                    pv[l[i].p][l[i].v]=pa.v;
                    if(!vis[l[i].p][l[i].v])
                    {
                        vis[l[i].p][l[i].v]=true;
                        net.p=l[i].p;
                        net.v=l[i].v;
                        q.push(net);
                    }
                }
            }
        }
    }
    double minn=0x7ffffff;
    for(int i=1;i<=500;i++)
        if(minn>map[end][i])
        {
            minn=map[end][i];
            a=pp[end][i];
            b=pv[end][i];
        }
    print(a,b);
    printf("%d",end-1);
}

原文地址:https://www.cnblogs.com/Lance1ot/p/8687701.html

时间: 2024-10-07 19:16:12

P1266 速度限制的相关文章

P1266 速度限制(分层图spfa)

P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快.一种可以辩解的解决方案是,按照原来的速度行驶.你的任务是计算两地间的最快路线. 你将获得一份现代化城市的道路交通信息.为了使问题简化,地图只包括路口和道路.每条道路是有向的,只连接了两条道路,并且最多只有一块限速标志,位于路的起点.两地A和B,最多只有一条道路从A连接到B.你可以假设加速能够在瞬间完

最短路相关练习(记得做)

P1027 Car的旅行路线https://www.luogu.org/problem/show?pid=1027 P1073 最优贸易https://www.luogu.org/problem/show?pid=1073 P1119 灾后重建https://www.luogu.org/problem/show?pid=1119 P1186 玛丽卡https://www.luogu.org/problem/show?pid=1186 P1260 工程规划https://www.luogu.org

Flume-ng 数据发送速度限制

在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action_move),抬起(action_up).各种响应归根结底都是基于View以及ViewGroup的,这两者中响应的方法分别有: View.java中: publi boolean dispatchTouchEvent(MotionEvent event) public boolean onTouch

golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后继续执行

package main import ( "fmt" "time" ) func main() { requests := make(chan int, 5) for i := 1; i <= 2; i++ { requests <- i } close(requests) limiter := time.Tick(time.Millisecond * 200) for req := range requests { //会循环两次,前面往reques

7段数码管倒计时,因为受turtle画笔速度限制,显示效果可能不如直接打印数字

7段数码管倒计时,因为受turtle画笔速度限制,显示效果可能不如直接打印数字,代码如下: import turtle as t import time def drawgap(ft): t.penup() t.fd(0.11*ft) def drawline(e,ft): drawgap(ft) t.pendown() if e else t.penup() t.fd(0.78*ft) drawgap(ft) t.right(90) def drawdigit(digit,ft): drawl

C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小

上一篇我们说到大文件的分片下载.断点续传.秒传,有的博友就想看分片下载,我们也来总结一下下载的几种方式,写的比较片面,大家见谅^_^. 下载方式: 1.html超链接下载: 2.后台下载(四种方法:返回filestream.返回file.TransmitTile方法.Response分块下载). 1.html超链接下载 超级链接在本质上属于一个网页的一部分,它是一种允许我们同其他网页或站点之间进行连接的元素. 各个网页链接在一起后,才能真正构成一个网站. 所谓的超链接是指从一个网页指向一个目标的

亿牛云API代理的访问速度限制

API访问速度限制在代理提取时间内只能访问一次API链接,超出的访问网站会返回中文提示访问频繁,程序需要暂停等待,直到下一次代理提取时间到期再访问,否则程序大量快速访问,网站可能会判断为***,直接黑名单禁止访问,停止该行为一段时间后会自动恢复访问许可..代理提取失败或提取之后大量代理访问失败由于私密家庭代理提取和使用都需要绑定IP白名单,因此必须确保提取和使用代理的服务器,其IP白名单都添加到后台:同时由于移动.手机热点.铁通.鹏博士.长宽是互联网多出口动态分配特性,导致出口IP随机变化,也会

[luoguP1266] 速度限制(spfa)

传送门 因为到某一没有限速的路径速度会有不同的可能,所以直接用 dis[i][j] 表示到第 i 个点速度为 j 时的最短时间,然后跑spfa. ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const int MAXN = 151; 8 int n, m, d, cnt; 9 int head[MAXN], to[MAXN *

flask扩展系列之 - 访问速度限制

flask-limiter 是一个对客户端的访问速率进行限制的flask扩展.可以自定义一些访问的(速度)限制条件来把那些触发限制的请求拒之门外.一般常用来进行对爬虫的限制. 下面就常见的用法,举了一些例子.更多的例子,请自己查看原始文档. from flask import Flask, request, render_template from flask_limiter import Limiter from flask_limiter.util import get_remote_add