不用二分过五组的玄学代码。。。。求助

P1462 通往奥格瑞玛的道路

xun0 @ 2018-08-19 16:26:38

#include<cstdio>
#include<iostream>
#include<queue>

using namespace std;

const long long int maxn=100000000000;

long long int f[10001],b,d[100001],ans;
int n,m,cnt,last[10001],vst[10001],pre[10001];

struct edge
{
    long long int c;
    int next;
    int to;
}a[100001];

void read();
void addedge(int x,int y,int z);
void spfa(int v);
void road(int v);

int main()
{
    freopen("a.in","r",stdin);
    read();
    for (int i=1;i<=n;++i)
    {
        d[i]=maxn;
        vst[i]=0;
    }
    spfa(1);
    if (d[n]>=b)
    {
        cout<<"AFK";
        return 0;
    }
    ans=f[1];
    road(n);
    cout<<ans<<endl; 
    return 0;
}

void road(int v)
{
    if (pre[v]!=1)  road(pre[v]);
    ans=max(ans,f[v]);
    return;
}

void spfa(int v)
{
    queue<int> q;
    q.push(v);
    vst[v]=1;d[v]=0;
    while (!q.empty())
    {
        int k=q.front();
        q.pop();
        vst[k]=0;
        for (int i=last[k];i>0;i=a[i].next)
        {
            if (d[a[i].to]>d[k]+a[i].c)
            {
                d[a[i].to]=d[k]+a[i].c;
                if (!vst[a[i].to])
                {
                    vst[a[i].to]=1;
                    pre[a[i].to]=k;
                    q.push(a[i].to);
                }
            }
        }
    } 
    return;
}

void read()
{
    cin>>n>>m>>b;
    for (int i=1;i<=n;++i)  cin>>f[i];
    cnt=0;
    for (int i=1;i<=n;++i)
    {
        last[i]=0;
    }
    for (int i=1,x,y,z;i<=m;++i)
    {
        cin>>x>>y>>z;
        addedge(x,y,z);
    }
}

void addedge(int x,int y,int z)
{
    cnt++;
    a[cnt].c=z;
    a[cnt].to=y;
    a[cnt].next=last[x];
    last[x]=cnt;
    ++cnt;
    a[cnt].c=z;
    a[cnt].to=x;
    a[cnt].next=last[y];
    last[y]=cnt;
    return;
}

不是很理解为什么二分,我把路径记录下来,然后在路径中找费用最大的点。可以过五组数据,求大佬救救我啊,蒟蒻都不会二分了


by lsroi @ 2018-08-23 17:16:44

@xun0 题目是要求使经过城市的最大花费最小,所以要二分,二分最小的花费是多少。然后在你写最短路时,如果有某个城市的花费大于你所二分的那个花费,那就不能经过该城市。


|