C++ P1576 最小花費
阿新 • • 發佈:2019-01-05
呃,用最短路dijkstra演算法,求一下。。。求。。求。。求一下 -0.0:
x = 100 / dis 其中,x是我們要求的最小費用,然後。。。有腦袋的人已經想到了,求出dis最大就好了(別問我為什麼),直接上程式碼。
最後再說一句,關注一下哇!# include <iostream> # include <cstdio> using namespace std; int n, m, tx, ty; // tx:起點 ty:終點 double map[2010][2010], dis[2010]; // map:鄰接表 dis:最短路存值 bool vis[2010]; // 訪問陣列,防止在求出到最短路得點,重複訪問 int main() { int u, v, z; cin >> n >> m; for(int i = 1; i <= m; i++) { cin >> u >> v >> z; map[u][v] = map[v][u] = double(100 - z) / 100; // 鄰接表儲存,並把值轉化為 1 - 0.01 * z } cin >> tx >> ty; dis[tx] = 1; // 最短路,從tx開始的,並賦值為1(別問為什麼不賦值為0,你把一個數乘以0給我看看) for(int i = 1; i <= n; i++) { // dijkstra 主體,開始嘍。 int mark = 0; double maxn = 0; // mark 存最大值的下標, maxn 自己看下面,注意要double型別 for(int j = 1; j <= n; j++) if(!vis[j] && dis[j] > maxn) maxn = dis[mark = j]; // 這裡就是更新manx,和找最大值的下標,別看寫的短 vis[mark] = true; // 找到最大值下標,vis設訪問過。 for(int j = 1; j <= n; j++) if(!vis[j]) // 這裡就更新dis的值了,max 要找dis最大嘛(相乘哦,理解式子) -_-|| dis[j] = max(dis[j], dis[mark] * map[mark][j]); } printf("%.8lf", 100 / dis[ty]); // 這裡再來一句廢話,精確到8位小數 return 0; }