CCF201712 4 行車路線

2021-08-15 11:52:37 字數 2451 閱讀 6840

(一)題目大意:

問題描述

小明和小芳出去鄉村玩,小明負責開車,小芳來導航。

小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走

s公里小明會增加

s2的疲勞度。

例如:有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3號路口到4號路口為大道,4號路口到5號路口為小道,相鄰路口之間的距離都是2公里。如果小明從1號路口到5號路口,則總疲勞值為(2+2)

2+2+2

2=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 7

1 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

樣例輸出

76樣例說明

從1走小道到2,再走小道到3,疲勞度為5

2=25;然後從3走大道經過4到達5,疲勞度為20+30=50;最後從5走小道到6,疲勞度為1。總共為76。

資料規模和約定

對於30%的評測用例,1 ≤ 

n ≤ 8,1 ≤ 

m ≤ 10;

對於另外20%的評測用例,不存在小道;

對於另外20%的評測用例,所有的小道不相交;

對於所有評測用例,1 ≤ 

n ≤ 500,1 ≤ 

m ≤ 10

5,1 ≤ 

a, b ≤ 

n, t是0或1,

c≤ 10

5。保證答案不超過10

6。(二)解題思路:

這個題在官網上發出來以後,開始並沒有想到什麼解決的辦法,但是看了資料範圍之後發現騙70分還是比較簡單的:其中的三個測試點n<=8,那麼我們可以直接生成1~n的乙個全排列,比如1->2->3->5->7->4->-6>8,表示一條1->8的路徑,我們暴力找出所有可能路徑的最小值便可以得出結果(路徑上要記錄連續走過的小路的長度),對於另外四個測試點,都是不存在連續的小路的,那麼我們直接將小路的距離平方,接下來就是普通的求兩點之間的最短路,這裡就可以騙到70分了。

好了,接下來進入正題:這個題比較麻煩的是走小路的時候不是很方便處理,需要記錄連續走多條小路時的總長度,後來便想到了先求出所有的連續走小路的情況,然後在求最終路徑的時候不讓走連續小路即可,具體操作為: 將所有的小路跑一遍floyd,跑完以後把所有的邊平方。這樣做完以後為什麼可以轉化為不讓其走連續小路呢?仔細想想,如果兩個點之間可以走連續小路到達,那麼在跑完floyd後,將會有一條直接連線這兩個點的路,且長度為這些小路長度和的平方。

做完上乙個步驟之後還是求最短路,我們類似dijkstra的做法,只不過要求圖中不能走連續小路即可:對於到達每個的距離儲存兩個最小值,分別是走小路到達和走大路到達。每個點也保留兩個狀態,表示前驅路徑分別小路和大路,然後某個點由小路到達的最短路徑只能由前驅路徑是大路的點去更新,說起來有點繞,具體細節參見**:

(三)具體**:

#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn=520;

ll mps[maxn][maxn],n,m;

ll mpm[maxn][maxn];

ll dist[maxn][2];

void deal_with_small()

}void init(ll nn)

struct node

}beg,in,out;

ll dijkstra()

}if(mpm[u][i]!=inf)}}

}return min(dist[n][0],dist[n][1]);

}int main();

vectoredges;

int small_m(int nn)

}else

dijkstra();

ans=dist[n];

}cout

}

CCF 201712 4 行車路線

思路 用兩個陣列維護到達某個點的最小大路距離和最小小路距離,注意結果中間過程可能爆int,不加long long 只有70分。有一種特殊情況就是通過走兩次大路,消除連續的小路值,這裡就是用兩個陣列維護的原因。include using namespace std const int maxn 100...

ccf 2017 12 4行車路線

dijkstra變形,注意點 1.雖然題目說最終答案不會超過 10 6,但是中間過程可能超int啊 超了以後溢位變小,可能會影響到最後的解 所以還是乖乖用long long 儲存吧 2.圖的話 一定要考慮重邊和反向邊 還是只有70分 看到網上直接用sum i 記錄以當前小路為結尾的前面的連續小路之和...

ccf 201712 4 行車路線

試題編號 201712 4 試題名稱 行車路線 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走...