1 条题解
-
0
按照题目给定方式建边之后跑 Dijkstra 后,你会发现有一些点 MLE 了,因为会出现一种环,使越跑越小,然后就一直往下跑。
对于这种情况我有一种比较直接的方法,因为在没有这种环的情况下,队列中最多有 个,然而如果有这种环,队列中就不止 个了,所以在 Dijkstra 里面判断就行。
给出代码。
#include <bits/stdc++.h> using namespace std; struct node{ int v; long double w; }; vector <node> a[2004]; priority_queue<pair<long double,int>,vector<pair<long double,int>>,greater<pair<long double,int>>> pq; long double dis[2004]; int vis[2005]; int main(){ int n,m; int s,t; long double v; cin >> n >> m; cin >> v>>s >> t; for (int i = 1; i <= m; i++){ int u,v; long double w; cin >>u >> v >> w; a[u].push_back({v,w}); } for (int i = 1; i <= n; i++) dis[i] = DBL_MAX; pq.push({v,s}); dis[s] = v; int flag =0; while (!pq.empty()){ int x = pq.top().second; pq.pop(); if (pq.size()>25000) {flag = 1;break;} //cout << x << " " << dis[x] << "\n"; vis[x] = 1; for (int i = 0; i < a[x].size(); i++){ int y = a[x][i].v; long double z =a[x][i].w; if (dis[y] > dis[x]*z){ //cout << x << " " << y << " " << z << "\n"; dis[y] = dis[x]*z; pq.push({dis[y],y}); } } } if (flag) {cout << 0;return 0;} cout << fixed << setprecision(8) << dis[t]; return 0; }
- 1
信息
- ID
- 1575
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者