小明和小芳出去鄉村玩,小明負責開車,小芳來導航.
小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走s公里小明會增加s2的疲勞度。
例如:有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3號路口到4號路口為大道,4號路口到5號路口為小道,相鄰路口之間的距離都是2公里。如果小明從1號路口到5號路口,則總疲勞值為(2+2)2+2+22=16+2+4=22。
現在小芳拿到了地圖,請幫助她規劃乙個開車的路線,使得按這個路線開車小明的疲勞度最小。
輸入格式
輸入的第一行包含兩個整數n, m,分別表示路口的數量和道路的數量。路口由1至n編號,小明需要開車從1號路口到n號路口。
接下來m行描述道路,每行包含四個整數t, a, b, c,表示一條型別為t,連線a與b兩個路口,長度為c公里的雙向道路。其中t為0表示大道,t為1表示小道。保證1號路口和n號路口是連通的。
輸出格式
輸出乙個整數,表示最優路線下小明的疲勞度。
樣例輸入
6 71 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
樣例輸出
樣例說明
從1走小道到2,再走小道到3,疲勞度為52=25;然後從3走大道經過4到達5,疲勞度為20+30=50;最後從5走小道到6,疲勞度為1。總共為76。
#include
#include
#define inf 1e18
using namespace std;
int n,m,head[
505]
, path[
505]
;long
long dis[
505]
,big_small[
505]
;//dis[i]一定是最小的,無論是從哪條路走過來的,big_small用來記錄i頂點是怎麼過來的(大路為0,小路為前面的小路之和)
bool vis[
505]
;struct edgeedge[
200010];
struct node
//建構函式
bool operator <
(const node &x)
const};
priority_queue q;
void
dij()}
else}}
else}}
}}intmain()
int x,y,wei,type;
for(
int i =
1;i <= m;i++
)dij()
; cout <<
"\n最優路徑為(倒序):"
<< n <<
" ";
int i = path[n]
;while
(i) cout << endl;
cout <<
"\n從出發點到各個點的最小疲勞值為:"
;for
(i =
1;i <= n;i++
) cout << dis[i]
<<
" ";
//cout << dis[n] << endl;
}
利用鏈式前向星(鄰接表)存圖,type變數表示某條路為小道或大道(true為小道,false為大道),weight為路的疲勞值,to表示該頂點的鄰接點,next表示該頂點關聯的另外乙個邊所在的位置。建立陣列dis,用來儲存到每個頂點的最小疲勞值,陣列big_small用來記錄到某個頂點是經過的是小道還是大道(大路為0,小路為前面走過的路徑中小路的疲憊值之和)。
將起點的dis和big_small設為0,然後利用dijsktra演算法:
從頂點v出發,遍歷它的鄰接點i。若該鄰接點若已經訪問過,則跳過;
否則,若(v,i)為大道,則判斷dis[i]是否大於dis[v]+(v,i),若大於則更新,並令big_small[i]=0;
若(v,i)為小道,先判斷經過頂點v是經過的是大道還是小道(即判斷big_small[v]是否為0),若是從大道過來的,則判斷dis[i]是否大於dis[v]+(v,i) *(v,i),若大於則更新dis[i],並令big_small[i]=(v,i);若是從小道過來的,則判斷dis[i]是否大於dis[v]+(big_small[v]+(v,i)) * (big_small[v]+(v,i)) - big_small[v] * big_small[v],其中後面的部分為從v到i的疲憊值減去到達v的疲憊值(即v到i的增量),若大於則更新dis[i],並令big_small[i]= big_small[v]+(v,i)。
然後利用優先佇列在dis陣列中找到最小的值。重複執行,直到頂點都被訪問。
CCF 201712 4 行車路線
思路 用兩個陣列維護到達某個點的最小大路距離和最小小路距離,注意結果中間過程可能爆int,不加long long 只有70分。有一種特殊情況就是通過走兩次大路,消除連續的小路值,這裡就是用兩個陣列維護的原因。include using namespace std const int maxn 100...
CCF201712 4 行車路線
一 題目大意 問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走 s公里小明會增加 s2的疲勞度。例如 有5個路口,1號路口到2號路口為小道,2號路口到3號...
ccf 2017 12 4行車路線
dijkstra變形,注意點 1.雖然題目說最終答案不會超過 10 6,但是中間過程可能超int啊 超了以後溢位變小,可能會影響到最後的解 所以還是乖乖用long long 儲存吧 2.圖的話 一定要考慮重邊和反向邊 還是只有70分 看到網上直接用sum i 記錄以當前小路為結尾的前面的連續小路之和...