1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n, m; struct Edge { int v, w, f; }; vector<Edge> e[1010]; struct Point { int id, dis; }; bool operator<(Point a, Point b) { return a.dis > b.dis; } int dis[1010]; bool vis[1010]; priority_queue<Point> q; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; int maxf = 0, minf = 0x3f3f3f3f; for (int i = 1; i <= m; i++) { int u, v, w, f; cin >> u >> v >> w >> f; e[u].push_back((Edge){v, w, f}); e[v].push_back((Edge){u, w, f}); minf = min(minf, f); maxf = max(maxf, f); } int ans = 0; for (int i = minf; i <= maxf; i++) { // 最短路 // 初始化 while (!q.empty()) { q.pop(); // //cout << " "; } memset(dis, 0x3f, sizeof(dis)); memset(vis, false, sizeof(vis)); dis[1] = 0; q.push((Point){1, 0}); // dijkstra for (int t = 1; t < n; t++) { while (!q.empty() && vis[q.top().id]) { q.pop(); } if (q.empty()) break; int u = q.top().id; vis[u] = true; for (int j = 0; j < e[u].size(); j++) { int f = e[u][j].f; if (f < i) continue; int v = e[u][j].v; if (vis[v]) continue; int w = e[u][j].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; q.push((Point){v, dis[v]}); } } } if (dis[n] == 0x3f3f3f3f) { continue; } double res = 1e6*i / dis[n]; ans = max(ans, (int)res); } cout << ans; return 0; }
- 1
信息
- ID
- 1786
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 18
- 已通过
- 9
- 上传者