xsy2304 哈 最短路

2022-05-03 18:57:09 字數 1050 閱讀 2693

題目大意:有乙個$n$個點,$m$條有向邊的圖,有$q$組詢問。

每次詢問:從$a$到$b$,經過不超過$c$條邊,且依次經過的邊邊權遞增,問最短路為多少,無解輸出-1。

資料範圍:$n≤150$,$m≤5000$,$q≤1000$

我場上並沒有去想正解,打了個spfa居然獲得$90pts$好成績。

首先對於經過不超過$c$條邊,當$c>n-1$時,是沒有意義的(顯然經過邊數不會超過$n-1$),這種情況下我們直接將$c$賦值為$n-1$即可。

我們設$dis[i][j]$表示從$a$出發,經過不超過j條邊後到達i的最短距離。

答案顯然為$\min\limits_^dis[b][i]$。

考慮如何滿足要求的邊權遞增:我們顯然只需要把這些邊從小到大排個序,然後從小到大拿出,丟去增廣即可。

單次查詢的複雜度顯然是$o(mc)$的,上限顯然是$o(nm)$。

那麼,總時間複雜度為$o(m\log\ m+qnm)$。

1 #include2

#define n 155

3#define m 5005

4#define inf 16843009

5using

namespace

std;67

struct

edge

10 friend bool

operator

<(edge a,edge b)

11}a[m];

12int

n,m,q;

1314

int dis[n][n]=;

15void spfa(int a,int b,int

c)23

int minn=inf;

24for(int i=0;i<=c;i++) minn=min(minn,dis[b][i]);

25if(minn==inf) minn=-1

;26 printf("

%d\n

",minn);27}

2829

intmain()

38 }

XSY1162 鬼計之夜 最短路

給你乙個 n 個點 m條邊的有向圖,有 k 個關鍵點。求一條最短的從乙個關鍵點到另乙個關鍵點的路徑。n,m,k 100000跑k 2 次最短路顯然會tle 考慮兩個不同的數有什麼可以利用的性質。其中會有至少乙個二進位制為不同!所以可以列舉所有二進位制位,從 0 的那邊向 1的那邊跑最短路,再從 1 ...

XSY2679 修牆 最短路

有乙個 n 1 m 1 的網格,每條邊都有乙個邊權。有一些格仔是城市。你要用乙個環圈住所有城市,要求環上所有邊的邊權和最小。重合的邊邊權算多次。保證左上角 1 1 一定有乙個城市。n,m 400 觀察到左上角一定有乙個城市。首先求出每個城市左上角到 0 0 的最短路,那麼這個圈肯定不會經過最短路。如...

XSY3370 道路建設 最短路

有乙個完全圖,邊有邊權。對於每個 i 求一棵生成樹,使得 sum n j 到 i 的路徑上邊權最小值 最小。n leq 2000,w leq 9 記最小的邊權 w 這條邊的乙個端點為 s 那麼 i 號點對應的生成樹就是從 i 到 s 的一條路徑,然後經過邊權最小的邊,再連向所有點。可以發現 i 到 ...