刷了两天了,我真蒻啊

P1462 通往奥格瑞玛的道路

Anonymous匿名者 @ 2019-07-23 20:41:27

大佬看看,我快疯了 (殡仪馆已经联系好了)

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};
    while(isdigit(c)){x=x*10+c-'0';c=getchar();};
    return x*f;
}
typedef pair<int,int> pii;
priority_queue <pii,vector<pii>,greater<pii> > q;
const int maxn=10005,maxm=50005;
const int inf=0x3f3f3f3f;
struct edge{
    long long v,w,next;
}e[maxm];
int cnt,head[maxn];
int n,m,b;
long long f[maxn],ff[maxn];
long long ans=-1;
int dis[maxn];
bool vis[maxn];
int maxx=-1;
void add(int u,int v,int w)
{
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}
bool judge(int money) 
{
    if(money<f[1]||money<f[n])
    return 0;
    memset(dis,inf,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[1]=0;
    q.push(make_pair(0,1));
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int k=head[u];k;k=e[k].next)
        {
            int t=e[k].v;
            if(f[t]<=money&&dis[u]+e[k].w<dis[t]) 
            {
                dis[t]=dis[u]+e[k].w;
                q.push(make_pair(dis[t],t));    
            }           
        }
    }
    //printf("shat %d %d\n",money,dis[n]);
    //printf("fff money=%d f[1]=%d vis[1]=%d f[n]=%d vis[n]=%d\n",money,f[1],vis[1],f[n],vis[n]);
    if(dis[n]<=b)
    {
    //  printf("%d ",dis[n]);
        return 1;
    }
    else return 0;
}
void readdata()
{
    n=read(),m=read(),b=read();
    for(int i=1;i<=n;i++)
    {
        f[i]=read();
        ff[i]=f[i];
    }
    maxx=max(f[1],f[n]);
    sort(ff+1,ff+n+1);
    /*for(int i=1;i<=n;i++)
    printf("%d ",ff[i]);
    printf("hello\n");*/
    for(int i=1;i<=n;i++)
    {
        int a,b,c;
        a=read(),b=read(),c=read();
        if(a==b) continue;
        add(a,b,c);
        add(b,a,c);
    }
    long long l=ff[1],r=ff[n];
    while(l<=r)
    {
        long long mid=l+r>>1;
        //printf("on no %d\n",mid);
        if(judge(mid))
        {   
            r=mid-1;
            ans=mid;
        //  printf("%d\n",ans);
        } 
        else l=mid+1;
    }
//  if(ans==970023169)
//  printf("723502837");
/*  else*/ if(ans!=-1)
    printf("%lld",ans);
    else printf("AFK");
}
int main()
{
    freopen("sss.in","r",stdin);
    //memset(head,-1,sizeof(head));
    readdata();
    return 0;
} 

by Gary818 @ 2019-07-23 20:51:56

@Anonymous匿名者
这题不是裸的SPFA咩


by Anonymous匿名者 @ 2019-07-23 21:01:49

@海阔天空818 我用的Dijk

但是应该没问题啊

你看一下出了什么毛病


|