P1576 最小花费
dijkstra 模板
需要对其进行改造
100 = value * 汇率 1 * 汇率2 * 。。。
那么汇率乘积越大越好
最短路便可改造为为最长路;
dis 初始化为 0 d 数组初始化为 0(最短路均初始化为inf)
松弛条件判定改变
if (!vis[j] && dis[j] < dis[uu] * d[uu][j]) {
dis[j] = dis[uu] * d[uu][j];
}、
寻找dis最长的点
int uu = -1;
double max_dist = 0;
for (int j = 1; j <= n; ++j) {
if (!vis[j] && max_dist < dis[j]) {
uu = j;
max_dist = dis[j];
}
}
插入数据改变
cin >> u >> v >> w;
d[u][v] = (100.0 - w) / 100.0;
d[v][u] = d[u][v];
//
// Created by 29273 on 2022-03-12.
//
#include "bits/stdc++.h"
using namespace std;
#define inf 0x3f3f3f3f
const int maxN = 1e4 + 10;
int pre[maxN], vis[maxN];
double dis[maxN];
double d[maxN][maxN];
int n, m, u, v, s, e;
double w;
void Init() {
for (int i = 0; i <= n; ++i) {
dis[i] = 0;
pre[i] = -1;
vis[i] = 0;
}
}
void Dijkstra(int root) {
Init();
dis[root] = 1;
for (int i = 0; i < n; ++i) {
int uu = -1;
double max_dist = 0;
for (int j = 1; j <= n; ++j) {
if (!vis[j] && max_dist < dis[j]) {
uu = j;
max_dist = dis[j];
}
}
if (uu == -1) break;
vis[uu] = 1;
for (int j = 1; j <= n; ++j) {
if (!vis[j] && dis[j] < dis[uu] * d[uu][j]) {
dis[j] = dis[uu] * d[uu][j];
}
}
}
}
int main() {
cin >> n >> m;
while (m--) {
cin >> u >> v >> w;
d[u][v] = (100.0 - w) / 100.0;
d[v][u] = d[u][v];
}
cin >> s >> e;
Dijkstra(s);
for (int i = 0; i <= n; ++i) {
cout << dis[i] << " ";
}
cout << fixed << setprecision(8) << 100.0 / dis[e] << endl;
return 0;
}

浙公网安备 33010602011771号