蒟蒻求查错,调了一个小时了

P1462 通往奥格瑞玛的道路

与我常在 @ 2019-09-24 10:21:56

贼难受

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10005;
const int M = 100005;

int n, m, b, num;
int f[N], dis[N], vis[N], head[N];
int to[M], val[M], next[M];

struct node {
    int d;
    int wz;
    bool operator < (const node & A) const {
        return d > A.d;
    }
};

priority_queue <node> q;

inline int Max(int x, int y) {
    return x > y ? x : y;
}

inline void add(int u, int v, int w) {
    to[num] = v;
    val[num] = w;
    next[num] = head[u];
    head[u] = num ++;
}

bool check(int x) {
    if(f[1] > f[x] || f[n] > f[x]) return false;
    memset(vis, 0, sizeof vis);
    memset(dis, 0x3f, sizeof dis);
    dis[1] = 0;
    q.push((node) {0, 1});

    while(!q.empty()) {
        node u = q.top(); q.pop();
        if(vis[u.wz]) continue;
        vis[u.wz] = 1;

        for(int i = head[u.wz]; ~i; i = next[i]) {
            if(dis[to[i]] > dis[u.wz] + val[i] && !vis[to[i]] && f[to[i]] <= f[x]) {
                dis[to[i]] = dis[u.wz] + val[i];
                q.push((node) {dis[to[i]], to[i]});
            }
        }
    }

    return b > dis[n];

}

void divi(int l, int r) {
    int ans = -1;
    while(l <= r) {
        int mid = l + r >> 1;
        if(check(mid)) ans = f[mid], r = mid - 1;
        l = mid + 1;
    }

    if(~ans) printf("%d\n", ans);
    else puts("AFK");
}

int main() {
    freopen("1.in", "r", stdin);
    scanf("%d %d %d", &n, &m, &b);

    for(int i = 1; i <= n; i ++) scanf("%d", &f[i]);

    memset(head, -1, sizeof head);
    for(int i = 1; i <= m; i ++) {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w);  add(v, u, w);
    }

    sort(f + 1, f + n + 1);
    int l = 1, r = n;
    divi(l, r);

    return 0;
}

by 与我常在 @ 2019-09-24 10:28:35

大佬们看一眼吧


by 与我常在 @ 2019-09-24 11:14:01

交的时候没有打freopen


by Provicy @ 2019-09-24 11:31:26

为啥要sort。。。


by Provicy @ 2019-09-24 11:32:16

还有你的dijkstra跑的看起来比较慢。。。


by president @ 2019-09-24 11:43:17

 while(l <= r) {
        int mid = l + r >> 1;
        if(check(mid)) ans = f[mid], r = mid - 1;
        l = mid + 1;
    }

你这一段,while里的条件和后面自己改一下,再试一下


by Papaya @ 2019-09-24 11:58:07

不要特判直接二分一把梭

还有你的ans为什么等于f[mid]

不应该直接等于mid吗

while(l<=r)
    {
        mid=(l+r)>>1;
        if(check(mid)) res=mid,r=mid-1;
        else l=mid+1;
    }
bool check(int x)
{
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis)); dis[1]=0;
    priority_queue < qq > q; q.push((qq){0,1});
    while(!q.empty())
    {
        int u=q.top().u;q.pop();
        if(vis[u]) continue;vis[u]=1;
        for(int j=head[u];j;j=e[j].nxt)
        {
            int v=e[j].v;ll d=e[j].d;
            if(f[v]>x) continue;
            if(dis[v]>dis[u]+d)
            {
                dis[v]=dis[u]+d;
                if(!vis[v])
                    q.push((qq){dis[v],v});
            }
        }
    }
    return dis[n]<=b;
}

参考一下吧


by 与我常在 @ 2019-09-24 16:24:07

@Papaya 我直接输出的ans,所以存的就是f[mid]


by 与我常在 @ 2019-09-24 16:25:29

@DXL 堆优化+前向星,不能再快了吧。。。

排序是为了二分答案啊,我二分的f数组的下标


by 与我常在 @ 2019-09-24 16:27:22

@president 怎么改呀,蒟蒻背的模板。。


by 与我常在 @ 2019-09-25 16:42:57

犯了一个贼蠢的错误,二分的时候l = mid + 1 前面没加else,还有排完序后建边也要发生改变,所以我直接二分的0和f数组最大值,此贴终结


| 下一页