DFS求有中轉站數限制的路徑最少花費

2021-09-23 18:48:14 字數 1658 閱讀 3814

某天,x要從1地走到n地,途中可能會經過許多中轉站。某些中轉站之間連線著雙向道路,這些雙向道路具有一定長度,可以認為走這些路的花費即為路的長度。此外,由於進入中轉站有著許多麻煩的手續,因此x希望在中途經過不超過k個中轉站的情況下到達b地(從1地出發以及進入n地均不計入耗費中轉站的次數內),並求出最短的花費。

注意起點和終點不計入總的中轉站花費。

第一行t表示資料個數.,t<=10

以下t組資料中,第一行三個數n,m,k。n為點數,m為邊數,k為途徑中轉站的最多數量。n<=10,0<=m(邊數)下面m 行,每行三個整數x,y<=n,d<=100並且x,y從1開始。表示有一條邊連線x,y,並且距離為d

無重邊與自環

輸出乙個數,為最短距離,不可達輸出-1

每組資料一行

23 2 0

1 2 1

2 3 1

3 2 1

1 2 1

2 3 1-12

思想:因為有中轉站數量的限制,所以我用的是深度優先搜尋dfs,然後把每條符合要求的路徑放入優先順序佇列中,最後取出花費最少的路徑即可。

自己到自己的距離為0,不可直接到達的距離為inf(無窮大)。

priority_queue,greater> q; //此時為小頂堆,因為預設是大頂堆,lessvoid init()

}//在這裡清空最小堆

while(!q.empty()) q.pop();

}

記錄當前節點、花費數和經過的節點數turn,根據判斷當前節點是否為目標節點以及turn-1是否小於等於最大可經過的中轉站數,來判斷是否把路徑放入優先順序佇列。

void dfs(int now,int step,int turn)

else if(turn-1>k)

vis[now] = 1;

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

}return;

}

#include #include #include #include #include #include #include #include #include #define inf 99999999

using namespace std;

const int maxn=105;

int e[maxn][maxn];

int vis[maxn];

int minx=inf;

int sx,ex;

int n,m,k;

priority_queue,greater> q; //此時為小頂堆,因為預設是大頂堆,lessvoid init()

}//在這裡清空最小堆

while(!q.empty()) q.pop();

}void dfs(int now,int step,int turn)

else if(turn-1>k)

vis[now] = 1;

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

}return;

}/*void dfs(int now,int sum,int turn)

}*/int main()

if(k == 0&&e[1][n]==inf)

else

else*/}}

}}

物流中轉站

shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的距離和。如果無法修建,則返回 1。若範圍限制...

距離最短中轉站

建物流中轉站 牛客網 物流中轉站 題目描述 shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的...

建物流中轉站

題目描述 shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的距離和。如果無法修建,則返回 1。...