(vector+Dij) sub0全RE,sub1全AC(悬关求调)
查看原帖
(vector+Dij) sub0全RE,sub1全AC(悬关求调)
846713
Joker_IV楼主2024/8/13 09:04

rt
看了很多警钟题解,一直找不到问题所在,代码如下,求大佬帮帮

#include <bits/stdc++.h>
#define MAXN 100010
#define INF 2147483647
using namespace std;
struct edge{
	int v;
   long long w;
};
struct node{
	int v;
   long long d;
	bool operator <(const node &x)const{
		return x.d > d;
	}
};
int cost[MAXN], vis[MAXN], n, m, b;
long long D[MAXN];
vector <edge>G[MAXN];
priority_queue <node> ans; 
bool Dij(int s){
	if(cost[1] > s)return false;
	fill(D, D + MAXN, INF);
	fill(vis, vis + MAXN, 0);
	D[1] = 0;
	ans.push((node) {1, 0});
	while(!ans.empty()){
		int u = ans.top().v;
		ans.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for(int i = 0; i < G[u].size(); i++){
			int v = G[u][i].v;
            long long w = G[u][i].w;
			if(D[u] + w < D[v] && cost[v] <= s){
				D[v] = D[u] + w;
				ans.push((node) {v, D[v]});
			}
		}
	}
	if(D[n] <= b)return true;
	else return false;
}
int main(){
	scanf("%d%d%d", &n, &m, &b);
	int ma = 0, mi = INF;
	for(int i = 1; i <= n;  i++){
		scanf("%d", &cost[i]);
		ma = max(ma, cost[i]);
		mi = min(mi, cost[i]);
	}
	for(int i = 1; i <= m; i++){
		int a, b;
        long long c;
		scanf("%d%d%lld", &a, &b, &c);
		G[a].push_back((edge){b, c});
		G[c].push_back((edge){a, c});
	}
	if(!Dij(INF)){
		printf("AFK");
		return 0;
	}
	while(ma > mi){
		int mid = (ma + mi) >> 1;
		if(Dij(mid))ma = mid;
		else mi = mid + 1;
	}
	printf("%d", mi);
 	return 0;
}
2024/8/13 09:04
加载中...