1. 程式人生 > >C++ P1576 最小花費

C++ P1576 最小花費

呃,用最短路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;
}
最後再說一句,關注一下哇!快哭了