M_sea

洛谷1951 收费站
Luogu分析二分答案+最短路。显然答案满足单调性。二分最少的费用,然后跑最短路,保证不经过费用大于它的点,保证油...
扫描右侧二维码阅读全文
05
2018/11

洛谷1951 收费站

Luogu

分析

二分答案+最短路。

显然答案满足单调性。

二分最少的费用,然后跑最短路,保证不经过费用大于它的点,保证油箱有油。

然后有一个优化:可以将$f[]$排序,然后二分1~n,检查f[mid]即可。这个很好理解。

判-1可以跑一遍最大费用为$\infty$的最短路。

细节见代码。

代码

#include <bits/stdc++.h>
#define re register
typedef int mainint;
#define int long long
using namespace std;

inline int read() {
    int X=0,w=1; char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
    return X*w;
}

struct Edge { int v,w,nxt; };
Edge e[100010];
int head[10010],cnt=0;

inline void addEdge(int u,int v,int w) {
    e[++cnt].v=v,e[cnt].w=w,e[cnt].nxt=head[u];head[u]=cnt;
}

int cost[10010];

struct HeapNode {
    int u,d;
    bool operator <(const HeapNode rhs) const {
        return d>rhs.d;
    }
};

priority_queue<HeapNode> Q;
int dis[10010];

inline int check(int x,int s,int t,int qwq) {
    if (cost[s]>x) return 0;
    while (!Q.empty()) Q.pop();
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0; Q.push((HeapNode){s,0});
    while (!Q.empty()) {
        HeapNode fr=Q.top(); Q.pop();
        int u=fr.u,d=fr.d;
        if (d!=dis[u]) continue;
        for (re int i=head[u];i;i=e[i].nxt) {
            int v=e[i].v,w=e[i].w;
            if (cost[v]<=x&&d+w<=qwq&&d+w<dis[v]) {
                dis[v]=d+w;
                Q.push((HeapNode){v,dis[v]});
            }
        }
    }
    if (dis[t]>qwq||dis[t]==dis[0]) return 0;
    else return 1;
}

int tmp[10010];

mainint main() {
    int n=read(),m=read(),s=read(),t=read(),Q=read();
    for (re int i=1;i<=n;++i) cost[i]=tmp[i]=read();
    for (re int i=1;i<=m;++i) {
        int u=read(),v=read(),w=read();
        addEdge(u,v,w);
        addEdge(v,u,w);
    }
    if (!check(2147483647,s,t,Q)) { puts("-1"); return 0; }
    sort(tmp+1,tmp+n+1);
    int L=1,R=n,f=0;
    while (L<R) {
        int mid=(L+R)>>1;
        if (check(tmp[mid],s,t,Q)) f=1,R=mid;
        else L=mid+1;
    }
    printf("%lld\n",tmp[L]);
    return 0;
}
最后修改:2018 年 11 月 09 日 06 : 53 PM

发表评论