題目鏈結
注意事項
dev c++宣告 檔案才能使用memset函式
最短路演算法一定要先初始化好相關的陣列變數,將相應的值初始化為最大值
題目最終所求的結果一般都很大,最好使用 long long 型別。
一定要先測試一遍程式再提交
最開始這道題我想用兩張圖同時用floyd演算法過一遍,最後發現這種想法是錯誤的
下面的這個方法採用了類似spfa演算法的思想,
dis[i]表示從起點到達i點的路徑的最後一段路程是大路。
dis1[i]表示從起點到達i點的路徑的最後一段路程是小路。
#include
#include
#include
#include
#include
using
namespace std;
#define debug
#define max 550
#define inf 0x3f3f3f3f
typedef
long
long ll;
int m, n;
vector
dis(max)
,dis1
(max)
;ll g[max]
[max]
, g1[max]
[max]
;vector<
bool
>
visit
(max,
false);
//計算所有以小路為連線的兩點之間的距離
void
floyd()
if(i == k || j == k)
continue;if
(g1[i]
[j]> g1[i]
[k]+ g1[k]
[j])}}
//dis1[i]第i條路為小路
//dis[i] 第i條路為大路
void
dij(
int s)
}//上一條是小路,這一條是大路
if(dis[i]
> dis1[top]
+ g[top]
[i])}if
(g1[top]
[i]< inf)
//說明這一條路是小路}}
}}}int
main()
else
}floyd()
;dij(1
);cout <<
min(dis[n]
, dis1[n]);
//以大路結尾和以小路結尾哪乙個距離更小
return0;
}
ccf 行車路線
問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走 s公里小明會增加 s2的疲勞度。例如 有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3...
CCF行車路線
首先這道題沒寫出來,困擾了好久,也看過了別人的 都是運用迪傑斯特拉和弗洛伊德相結合,但是我不是很理解,要再深入理解一下這兩個演算法。期間用了記憶化搜尋,得了六十分 用了求出每條路徑再計算每條路徑值,超時,加了最優性剪枝,也只有三十。先記下這道題,回頭再寫。include include define...
ccf 行車路線
問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走s公里小明會增加s 2的疲勞度。例如 有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3號...