为什么TLE更严重?
查看原帖
为什么TLE更严重?
305002
vegetable_ste楼主2021/8/3 20:27

把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;
}
2021/8/3 20:27
加载中...