過路費 (最短路)

2021-08-09 22:42:33 字數 2636 閱讀 9239

問題描述

有一天你來到了乙個奇怪的國家,它有 n 個城市,城市之間有若干條雙向道路連線,每條道路都有一定的費用,經過城市也要一定的費用。從乙個城市到達另乙個城市的總花費為路徑上費用最大的城市費用(包括起點和終點)加上路徑上所有的道路的費用。給出 q 次詢問,分別回答每次詢問中兩城市間的最少花費。保證城市之間可以互達。

輸入格式

第一行兩個整數 n,m,表示有 n 個城市 m 條道路。

接下來 n 行每行乙個整數,表示城市的費用 ci。

接下來 m 行每行三個整數,x,y,z,表示城市 x 和城市 y 間有一條費用為 z 的道路。

接下來一行乙個整數 q,表示詢問次數。

接下來 q 行每行兩個整數 x,y(x 不等於 y),表示詢問從城市 x 到城市 y 的最小花費。

輸出格式

共 q 行每行乙個整數,第 i 行的整數表示第 i 次詢問的答案。

樣例輸入

3 3

1 3

2 1 2 1

2 3 1

1 3 3

2 1 3

1 3

樣例輸出

5

5

資料規模

對於 30%的資料,n<=10,m<=20,q<=5。

對於 60%的資料,n<=200,m<=4000,q<=100。

對於 100%的資料,n<=300,m<=40000,q<=100000,1<=ci<=100000,1<=z<=1000。

鑑於n這麼小,當然要列舉最大點權。

做法一:改進floyd

注意到floyd演算法的三層迴圈,那麼假設外層為

k ,內層為i,

j,那麼此時經過的點必定屬於

⋃ 中,那麼如果將點權排序,則當前算出的最短路中最大點權一定是i,

j,k 中的乙個。

由此只需要在floyd中加入乙個an

s[i]

[j] 表示所求答案,得到轉移 an

s[i]

[j]=

min

**:

#include

#include

#include

#include

#define n 305

using

namespace

std;

struct nodeb[n];

bool cmp(node a,node b)

sort(b+1,b+n+1,cmp);

for(i=1;i<=n;i++)id[b[i].y]=i;

memset(ans,10,sizeof(ans));

memset(map,10,sizeof(map));

for(i=1;i<=n;i++)map[i][i]=0;

for(i=1;i<=m;i++)

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

scanf("%d",&q);

while(q--)

}

做法二:一般最短路演算法

既然要列舉最大點權,那麼大於列舉的點權的點不走即可,那麼從列舉的點出發跑單源最短路,然後同樣用 an

s[i]

[j]=

min 轉移即可。

由於兩點之間的最短路上每乙個點都會被討論到,所以正確性是顯然的。

**:

#include

#include

#include

#include

#include

#define n 305

#define m 100005

using

namespace

std;

int n,m,c[n],ans[n][n];

int tot,la[n],ne[m],en[m],le[m];

int dis[n];

bool mark[n];

queue

q;void add(int x,int y,int z)

void spfa(int s)}}

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)ans[i][j]=min(ans[i][j],dis[i]+dis[j]+c[s]);

}int main()

memset(ans,60,sizeof(ans));

for(i=1;i<=n;i++)spfa(i);

scanf("%d",&k);

while(k--)

}

過路費Cow Toll Paths 思路

從草地1到草地3的道路的 邊過路費 為3,草地2的 點過路費 為5。要從草地1走到草地4,可以從草地1走到草地3再走到草地5最後抵達草地4。如果這麼走的話,需要的 邊過路費 為2 1 1 4,需要的點過路費為4 草地5的點過路費最大 所以總的花費為4 4 8。而從草地2到草地3的最佳路徑是從草地2出...

過路費 C組模擬賽

題目大意 給出乙個圖,每個點都有點權,每條邊都有邊權,k次詢問使得x到y的 邊權 最大點權 最小 解題思路 資料比較小,floyd就可以過 然後稍稍變形就可以了 源程式 include include include define min a,b ab a c?a c b define inf 1e...

過路費(最小生成樹 lca)

題目描述 在某個遙遠的國家裡,有 n個城市。編號為 1,2,3,n。這個國家的 修建了m 條雙向道路,每條道路連線著兩個城市。規定從城市 s 到城市t需要收取的過路費為所經過城市之間道路長度的最大值。如 a到b長度為 2,b到c 長度為3,那麼開車從 a經過 b到c 需要上交的過路費為 3。佳佳是個...