把BFS SPFA的queue换成stack后T的点更多,用stack模拟递归运行机制有什么不同吗?
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, double> PII;
#define mp make_pair
const int N = 3010;
int n, m;
vector<PII> g[N], e[N];
int st[N], cnt[N]; double dist[N];
bool SPFA(double);
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i ++ ) {
int x, y; double z; cin >> x >> y >> z;
g[x].push_back(mp(y, z)); // g[y].push_back(mp(x, z));
}
double L = -1e7 - 10, R = 1e7 + 10, ans = 1e7 + 10;
while(L <= R && R - L >= 1e-10) {
double mid = (L + R) / 2;
if(SPFA(mid)) { ans = min(ans, mid); R = mid; }
else L = mid;
}
cout << fixed << setprecision(8) << ans << endl;
return 0;
}
bool SPFA(double x) {
memset(st, 0, sizeof st);
memset(cnt, 0, sizeof cnt);
for(int i = 1; i <= n; i ++ ) e[i] = g[i], dist[i] = 1e10;
for(int i = 1; i <= n; i ++ )
for(unsigned j = 0; j < e[i].size(); j ++ )
e[i][j].second -= x;
stack<int> Q;
Q.push(1); dist[1] = 0.0; st[1] = 1;
while(!Q.empty()) {
int t = Q.top(); Q.pop(); st[t] = 0;
for(unsigned i = 0; i < e[t].size(); i ++ ) {
int u = e[t][i].first; double w = e[t][i].second;
if(dist[u] > dist[t] + w) {
dist[u] = dist[t] + w;
if(!st[u]) { Q.push(u); st[u] = 1; }
cnt[u] ++ ;
if(cnt[u] > n + 2) return true;
}
}
}
return false;
}