求助P1462,90pts
  • 板块灌水区
  • 楼主44_FeiDing
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/25 11:44
  • 上次更新2023/11/3 01:20:34
查看原帖
求助P1462,90pts
876232
44_FeiDing楼主2023/8/25 11:44

WA on #5、#11、#12

#include<iostream>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
struct edge{
    int v,w;
};
struct point{
    int id,d;
    bool operator <(point a) const{
        return d>a.d;
    }
};
int n,m,b,l=1e18,r,ans;
int f[100002],dis[100002];
bool vis[100002];
vector<edge> g[100002];
priority_queue<point> q;
void dij(int);
signed main(){
    cin>>n>>m>>b;
    for(int i=1;i<=n;i++){
		cin>>f[i];
		r=max(r,f[i]);
	}
	l=max(f[1],f[n]);
    for(int i=1;i<=m;++i){
        int u,v,w;
        cin>>u>>v>>w;
        g[u].push_back((edge){v,w});
        g[v].push_back((edge){u,w});
    }
    while(r-l>1){
        int mid=(r+l)/2;
        dij(mid);
        if(dis[n]<=b){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    dij(l);
    if(dis[n]<=b)
        cout<<l;
    else
        cout<<"AFK";
}
void dij(int maxx){
	if(maxx<f[1]||maxx<f[n])
		return;
    for(int i=1;i<=n;i++){
		dis[i]=1e18;
		vis[i]=0;
	}
    while(!q.empty())
        q.pop();
    q.push((point){1,0});
    dis[1]=0;
    while(!q.empty()){
        int u=q.top().id;
        q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(int i=0;i<g[u].size();++i){
            int v=g[u][i].v;
            int w=g[u][i].w;
            if(f[v]>maxx)
                continue;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                q.push((point){v,dis[v]});
            }
        }
    }
}
2023/8/25 11:44
加载中...