某天,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。...