最短路 dij鏈式向前星優先佇列優化

2021-09-26 16:20:00 字數 1785 閱讀 2423

暑假集訓的休息日到了,本想在學校自習的babilong在ly和sun_of_ice的蠱惑下,被拉去了my的電影院玩遊戲。my共有n個區域,包括學校,電影院和n-2個其他區域,其他區域中都是休息站,休息站中沒有學校和電影院。並且在my有m條道路,每條道路連線a,b兩個區域且通過此條道路需要付出c的**(雙向道路)。他們決定乘坐鴿鴿專車從學校前往電影院,因為這樣雖然咕咕咕咕但經濟實惠。優惠政策有2條如下所示:

1.my的每條道路都可以半價優惠。

2.可以選擇給定k條道路中的任意一條道路免費,其他道路原價收費。

因為xx的原因,他們只能選擇一條優惠政策,當然也可以不選擇。

input

第一行包括4個整數n,

m,s,

e(2≤

n≤1000,1

≤m≤10000,1

≤s,e

≤n),分別表示有

n個區域,

m條道路,學校所在的區域s,電影院所在的區域e。

接下來m

行每行3個整數a,

b,c(

1≤a,

b≤n,

1≤c≤

1000)表示

m條道路的資訊。

接下來乙個整數k(

0≤k≤

1000

),表示有

k條道路可選擇其中的一條免費。最後k

行,每行乙個整數x(

1≤x≤

m)表示可以選擇第

x條道路免費。

output

第一行輸出從學校到電影院的最小花費,若不能到達輸出-1。

sample input

raw5 5 1 5

1 2 2

2 3 2

2 4 2

3 5 100

4 5 214

sample output

raw3

這個題首先用dij求出半價最短路,然後在讓能免費的路全部遍歷一次,每次記錄,計算,再恢復,求出最小。第一次我都是用for迴圈直接暴力的,但超時了。我一直認為是在求免費路時沒有優化,後來想了一下,每一次都要進行dij,我們就可以優化dij,所以用優先佇列優化dij就就可以了。

**:

#include#include#include#include#include#include#define me(x,b) memset(x,b,sizeof(x))

#define lowbit(x) x&(-x)

#includeusing namespace std;

typedef long long ll;

const int maxn=1e4+5;

const int maxn1=1e6;

int vis[1005];

int d[1005];

int t[1005];

int head[maxn];

int n,m,x,y;

struct node

e[maxn<<2];

void add(int x,int y,int val, int k)

int dij(int a)}}

}return d[y];

}int main()

int k;

scanf("%d",&k);

for(int i=1;i<=k;i++)

scanf("%d",&t[i]);

int s=dij(x);

if(s==maxn1)

else

printf("%d\n",s);

}return 0;

}

最短路(dij 優先佇列優化)模板

有n個城市,求s到e的最短路徑 當n的值較小時,直接用 dij 演算法沒有問題,但是當數值較大或者訪問過多時就需要優化 演算法思想 貪心,從起點開始,不斷的尋找不同點到起始點的最短距離 鏈結一篇部落格 新增鏈結描述 include include include include include in...

HDOJ 2544 最短路(DIJ 優先佇列)

最短路 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運...

單源最短路模板(dij 優先佇列)

很多人也許學了spfa,覺得簡單方便,然而呢,spfa的複雜度是o 玄學 容易被出題人出資料卡,於是我們要學用優先佇列優化的dij。如果大家理解dij演算法的核心,那麼也會很容易理解為什麼優先佇列可以優化的。沒優化前的dij,我們每次鬆弛都要遍歷1 n 1 to n 1 n,來找到dis i dis...