Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
193899 | luckypet | 银行转帐 | C++ | 通过 | 100 | 0 MS | 248 KB | 1391 | 2025-05-27 14:35:51 |
#include <iostream> #include <vector> #include <queue> #include <iomanip> using namespace std; struct Edge { int to; double rate; // 剩余比例,例如99%表示为0.99 }; int main() { int n, m; cin >> n >> m; vector<vector<Edge>> adj(n + 1); // 1-based indexing for (int i = 0; i < m; ++i) { int a, b, c; cin >> a >> b >> c; double rate = (100.0 - c) / 100.0; adj[a].push_back({b, rate}); adj[b].push_back({a, rate}); } int A, B; cin >> A >> B; vector<double> max_rate(n + 1, 0.0); // 从A到各节点的最大乘积 vector<bool> visited(n + 1, false); priority_queue<pair<double, int>> pq; // 大顶堆 max_rate[A] = 1.0; pq.push({1.0, A}); while (!pq.empty()) { int u = pq.top().second; pq.pop(); if (visited[u]) continue; visited[u] = true; for (const Edge& e : adj[u]) { int v = e.to; double new_rate = max_rate[u] * e.rate; if (new_rate > max_rate[v]) { max_rate[v] = new_rate; pq.push({max_rate[v], v}); } } } double min_amount = 100.0 / max_rate[B]; cout << fixed << setprecision(8) << min_amount << endl; return 0; }