不开O2 0分,开O2RE,求助
查看原帖
不开O2 0分,开O2RE,求助
312820
Chinshyo楼主2023/8/14 00:18

求助大佬们

  1. 不懂为什么开O2会RE,而且开O2前后T的点不一样
  2. 求大佬看看这个算法怎么优化,没开O2T了。实在不太会优化了,我直接小根堆优化的dij+二分(找钱的方案),用的第二篇题解的思路
  3. 不太懂为什么会WA,有什么特殊情况要判断吗

开O2

不开O2

#include<bits/stdc++.h>
using namespace std;

const int N = 50005, M = 50005;
int f[N], dis[N], n, m, b;
bool vis[N];
int head[N], ver[M], edge[M], nxt[M], num = 0; //Chain Forward Star

void add(int x, int y, int c) {
	ver[++num] = y, edge[num] = c;
	nxt[num] = head[x], head[x] = num;
}

priority_queue < pair<int, int> > q;

bool chk(int cst) {
	for(int i = 1; i <= n; i++) {
		dis[i] = INT_MAX;
		vis[i] = 0;	
	}
	
	q.push(make_pair(0, 1));
	dis[1] = 0;
	while(!q.empty()) {
		pair <int, int> p = q.top();
		q.pop();
		int dist = -p.first, x = p.second;
		if(x == n) {
			if(dis[n] > b) return false;
			return true;
		}
		if(vis[x]) continue;
		vis[x] = true;
		for(int i = head[x]; i > 0; i = nxt[i]) {
			int y = ver[i], c = edge[i];
			if(dist + c < dis[y] && f[y] <= cst)  {
				dis[y] = dist + c;
//				cout  << y << "》》"<< dis[y] << endl;
				q.push(make_pair(-dis[y], y));
			}
		}
	}
//	for(int i = 1; i <= n; i++)
//		cout << dis[i] << " ";
//	cout << endl;
//	if(dis[n] <= cst) return true;
//	return false;
}

int main() {
//	freopen("a.aaa" , "w", stdout);
	cin >> n >> m >> b;
	for(int i = 1; i <= n; i++) cin >> f[i];
	
	int x, y, c;
	for(int i = 1; i <= m; i++) {
		cin >> x >> y >> c;
		add(x, y, c);
		add(y, x, c);
	}
	
	long long l = 1, r = 1000000005;
	long long mid = (l + r) >> 1;
	while(l <= r) {
		bool tmp = chk(mid);
//		cout << l << " " << r << " " << tmp<< endl;
		if(tmp == 1) {
//			cout  << " Hello " << r << endl;
			r = mid - 1;
			
			mid = (l + r) >> 1;
		} else {
			l = mid + 1;
			mid = (l + r) >> 1;
		}
	} 
	cout << l << endl; 
	return 0;
}
2023/8/14 00:18
加载中...