HDU 5361 最短路變形

2022-04-08 07:43:04 字數 1218 閱讀 7834

點選開啟鏈結

題意:給了n個點排成一行,每兩個距離為1,然後對於每個點來說它有個l和r,意思是距離在l到r中間的所有點它都能到達,費用是c,問從小出發的單源所有的點的距離

思路:看了網上神犇的題解有了點思路,因為每個點出去的費用都是相同的,而且費用的值大於0,那麼1點直接到達的所有點的最短路就不需要在更新了,因為剩下的肯定是比它大的,那麼對於這些個點我們壓入佇列,但是注意我們這裡的dis設定為點的加和,然後出發的又是最短的,到達的沒有訪問過的點又是最小的,所以不需要最短路時的乙個點可以訪問多次更新最小值,然後對於訪問過的點我們可以用並查集來判斷,對於乙個點來說,它若訪問過則與右邊的點合併,這樣我們就可以直接訪問下乙個沒被訪問過的點,而不需要暴力尋找了,優化的就是這裡

#pragma comment(linker, "/stack:102400000,102400000")

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const ll inf=0x3f3f3f3f3f3f3f3fll;

const int maxn=200010;

typedef pair p;

int l[maxn],r[maxn],f[maxn],n;

ll dis[maxn],c[maxn];

int find1(int x)

void unite(int a,int b)

void dijkstra(int s)

unite(ff,ff+1);

ff++;}}

}}int main(){

int t;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

for(int i=1;i<=n;i++) scanf("%d",&l[i]);

for(int i=1;i<=n;i++) scanf("%d",&r[i]);

for(int i=1;i<=n;i++) scanf("%i64d",&c[i]);

for(int i=1;i

hdu5361 最短路 並查集

題意 有n個點排成一排,編號從1到n,每個點可以到自己 l,r 距離的位置,花費c,問一號店到其他點的最小花費 pragma comment linker,stack 102400000,102400000 include include include include include includ...

hdu3790 最短路變形

這題就是比普通的最短路多維護了乙個cot陣列,cot i 表示的是起點到i節點的最短路徑對應的最小花費。要注意重邊的處理,我用鄰接表存圖,應該是重邊沒處理好,畢竟鄰接表處理重邊不太方便要把全部的都遍歷一遍,以後有重邊的情況還是用鄰接矩陣存圖算了。includeusing namespace std ...

hdu3790 最短路變形

這題就是比普通的最短路多維護了乙個cot陣列,cot i 表示的是起點到i節點的最短路徑對應的最小花費。要注意重邊的處理,我用鄰接表存圖,應該是重邊沒處理好,畢竟鄰接表處理重邊不太方便要把全部的都遍歷一遍,以後有重邊的情況還是用鄰接矩陣存圖算了。includeusing namespace std ...