速度限制
給出一張有向圖,每條邊有乙個長度和乙個速度限制(和日常的限速差不多)。
但是有一些路的限速我們也不知道,所以就只能猜乙個,於是就令上一條路的限速為限速。(感覺好隨意啊)
求從起點 \(0\) 到終點 \(d\) 的最短時間。(注意:乙個節點是可以重複走的)
那個...,\(t=s/v\) 就不用我多說了吧。
有兩個條件就跑二位最短路吧。
用 \(dis(x,v)\) 表示到達節點 \(x\) 的路限速 \(v\) 的最短時間,然後和普通最短路沒什麼兩樣。
沒有限速的時候令 \(v=pre_v\) 即可。
注意,如果是用 dijkscal 跑的或要注意一下每次取出隊首時令 \(vis(x,v)=false\)。(類似於 spfa)
因為可以重複入隊,所以不能只走一次。
普通的最短路可以這樣是因為顯然有正邊權的最短路重複走乙個點一定不是最優的。
注意一下就好哈。
#include#include#include#include#include#include#define n 3010
using namespace std;
const double inf=999999999.0;
int n,m,t,head[n*10],cnt=0;
double dis[n][n];
bool vis[n][n];
struct pathpath[n][n];
struct nodeed[n*10];
int read()
void add(int u,int v,int v,int w)
void print(int x,int v)
priority_queue> >q;
void dij(int s);
if(!vis[v][v])
q.push(make_pair(-dis[v][v],make_pair(v,v))),vis[v][v]=true;
}} else;
if(!vis[v][v])
q.push(make_pair(-dis[v][v],make_pair(v,v))),vis[v][v]=true;}}
} }int mn=0;
dis[t][mn]=inf;
for(int i=1;i<=1000;i++)
if(dis[t][i]完結撒花
洛谷P1266 速度限制
解題思路 1.求最快路線類似於求最短路,想到用spfa解決。2.和一般的spfa不同,本題的路徑中是以距離 速度來更新答案的,並且速度存在兩種情況,需要分別分析。3.既然有了速度這個變數,我們需要用陣列來儲存記錄速度,dis i j 表示從到i點時速度為j的最快路線。在更新最短路的時候判斷一下速度是...
洛谷 P1266 速度限制 題解
題面 這道題可以理解為是乙個分層圖,也可以理解為是二維的spfa dis i j 表示到達i這個點速度為j的最短路 然後跑已經死了的spfa就好了 include define inc i,a,b for register int i a i b i using namespace std int ...
spfa裂點 洛谷P1266 速度限制
我靠直接裂點 就是d i j 表示在速度為j的時候到i最短時間 相對的g i j 2 就記錄方案 這樣大力裂點跑spfa就好了 這樣的話,原來的queue裡面要存兩個值 乙個是點,乙個是速度 但是我懶,僅僅存了點 然後在spfa的時候列舉速度 雖然滿了一點,還是過了 include using na...