萌新刚学 OI 1e-10s WA #8,求助!

P1462 通往奥格瑞玛的道路

Shirο @ 2020-11-25 21:23:34

思路 二分+spfa,感觉没大问题?

#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn=1e4+5;
const int maxx=1e18;
int n,m,b;
int cost[maxn],v[maxn],d[maxn];
vector< pair<int,int> > g[maxn];
void add(int u,int v,int w){g[u].push_back(make_pair(v,w));}
void spfa(int c)
{
    fill(v+1,v+n+1,0);
    fill(d+1,d+n+1,maxx);
    queue<int>q;
    d[1]=0,v[1]=1;q.push(1);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        //if(cost[x]>c)continue;
        for(int i=0;i<g[x].size();++i)
        {
            int y=g[x][i].first;
            int z=g[x][i].second;
            if(cost[y]>c)continue;
            if(d[y]>d[x]+z)
            {
                d[y]=d[x]+z;
                if(!v[y])q.push(y),v[y]=1;
            }
        }
    }
}
bool check(int x)
{
    spfa(x);
    for(int i=1;i<=n;++i)cout<<d[i]<<' ';
    cout<<endl;
    //getchar();
    return d[n]<=b;
}
signed main()
{
    f//reopen("data.in","r",stdin);
    cin>>n>>m>>b;
    int l=maxx,r=0;
    for(int i=1;i<=n;++i)cin>>cost[i],l=min(l,cost[i]),r=max(r,cost[i]);
    for(int i=1;i<=m;++i)
    {
        int x,y,z;
        cin>>x>>y>>z;
        if(x==y) continue;
        add(x,y,z);
        add(y,x,z);
    }
    int ans=0;
    if(!check(r))
    {
        cout<<"AFK";
        return 0;
    }
    while(l<=r)
    {
        int mid=(l+r)>>1;
        //cout<<l<<' '<<r<<endl;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    cout<<ans<<endl;

}

by BFqwq @ 2020-11-25 21:26:21

你 check 函数里为什么有输出啊


by BFqwq @ 2020-11-25 21:26:31

@万岁小姐姐


by Shirο @ 2020-11-25 21:26:51

@世界第一肥宅BF 抱歉,作为调试

请自动忽略


by 银杉水杉秃杉 @ 2020-11-25 21:29:53

很明显spfa要爆,建议dijkstra+优先队列

都0202年了,SPFA已死,dijkstra当立


by 是个汉子 @ 2020-11-25 21:29:58

这不是dij吗


by BFqwq @ 2020-11-25 21:30:59

这跟最短路写法没关系吧(

看着思路好像没啥问题(


by Light_snow @ 2020-11-25 21:44:31

用dij吧 这题应该卡spfa

spfa和dij是不同的算法 所以面对不同的数据效率不一样


by Shirο @ 2020-11-25 21:48:32

@银杉水杉秃杉 @Dix_

spfa过了,原因是没把v[x]清回0


|