求助大神 90分心态已崩

P1462 通往奥格瑞玛的道路

司徒stuart @ 2017-09-22 20:32:44

···

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
long long n,m,b;
int vis[10010];
long long f[10010],viss[10010],ans,fmax,bl[10010];
struct cost{
    int id;
    long long w;
};cost blood;
queue<int> q;
vector<cost> g[10010];
int relax(int x,int y)
{
    if(bl[g[x][y].id]>bl[x]+g[x][y].w)
    {
        bl[g[x][y].id]=bl[x]+g[x][y].w;
        return true;
    }
    else return false;
}
int spfa(long long x)
{
    memset(bl,0x3f3f3f,sizeof(bl));
    memset(vis,1,sizeof(vis));
    bl[1]=0;q.push(1);vis[1]=false;
    if(fmax>x) 
    {
        return false;
    }
    while(!q.empty())
    {
        int v=q.front();q.pop();vis[v]=true;
        for(int i=0;i<g[v].size();i++)
        {        
            if(relax(v,i)&&vis[g[v][i].id]&&f[g[v][i].id]<=x)//松弛成功且下一个点不在队列中 
            {        
                q.push(g[v][i].id);
                vis[g[v][i].id]=false;
                ans=max(ans,f[g[v][i].id]);    
            }
        }
    }
    if(bl[n]>=b) return false;
    else return true;
}
int main()
{
    long long ai,bi,ci,r=0,l=0;
    cin>>n>>m>>b;
    for(int i=1;i<=n;i++)
    {
        cin>>f[i];
        r=max(r,f[i]); 
    }
    fmax=max(f[1],f[n]);
    for(int i=0;i<m;i++)
    {
        cin>>ai>>bi>>ci;
        if(ai==bi) continue;
        blood.id=bi;
        blood.w=ci;
        g[ai].push_back(blood);
        blood.id=ai;
        g[bi].push_back(blood);
    }
    if(!spfa(1000000001))
    {
        cout<<"AFK";
        return 0;
    }
    while(l<=r)
    {
        ans=fmax;
        int m=(l+r)/2;
        if(spfa(m)) r=m-1;
        else l=m+1;
    }
    cout<<ans;
    return 0;
 } 
···

|