1 条题解

  • 0
    @ 2026-6-15 15:01:00

    // 同余最短路 SPFA 算法 O(nm)
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int N=1e5+5,M=5e6+5;
    ll idx,h[N],to[M],ww[M],ne[M];
    void add(ll u,ll v,ll w){
      to[++idx]=v;ww[idx]=w;ne[idx]=h[u];h[u]=idx;
    }
    ll n,q,v1,c1,V,v[55],c[55],d[N];
    bool vis[N];
    
    void SPFA(){
      for(int i=0; i<=v1; i++) d[i]=-1e18; d[0]=0;
      queue<ll> q; q.push(0);
      while(!q.empty()){
        ll u=q.front(); q.pop(); vis[u]=false;
        for(int i=h[u]; i; i=ne[i]){
          ll v=to[i],w=ww[i];
          if(d[v]<d[u]+w){
            d[v]=d[u]+w;
            if(!vis[v]) q.push(v),vis[v]=true;
          }
        }
      }
    }
    int main(){
      scanf("%lld%lld",&n,&q); v1=1,c1=0;
      for(int i=1; i<=n; i++){
        scanf("%lld%lld",&v[i],&c[i]); //体积,价值
        if(c[i]*v1>v[i]*c1) v1=v[i],c1=c[i]; //找出性价比c/v最大的
      }
      for(int i=0; i<v1; i++)for(int j=1; j<=n; j++){
        add(i,(i+v[j])%v1,c[j]-(i+v[j])/v1*c1);
      } 
      SPFA();
      for(int i=1; i<=q; i++){
        scanf("%lld",&V);
        if(d[V%v1]==-1e18) puts("-1");
        else printf("%lld\n",V/v1*c1+d[V%v1]);
      }
    }
    
    • 1

    D127 同余最短路 SPFA 算法「THUPC 2023 初赛」背包

    信息

    ID
    7371
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者