关于本题初值设置的问题
查看原帖
关于本题初值设置的问题
213535
Bluebird_楼主2023/3/15 18:03

dp[0]中初始值的设置,过大的时候会WA,过小的时候也会WA,例如

for(int i=0;i<N;++i)
   dp[0][i]=0x3f3f3f3f3fll;//AC
若 是LONG_LONG_MAX/3,LONG_LONG_MAX/2,0x3f3f3f3f则WA

这是为什么??

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define P pair<int,int>  
const int N=1e6+100;
int head[N],nxt[N],to[N],cnt,val[N];
void add(int u,int v,int w){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w;}
int n,m,k;
int dis[N],vis[N],q[N],hd,tl,dp[25][N],kk;
P mp(int x,int y){return make_pair(x,y);}
int X(int x){return q[x];}
int Y(int x){return dp[kk-1][q[x]]+q[x]*q[x];}
priority_queue<P >Q;
void d(int now)
{
    for(int i=1;i<=n;++i)
        vis[i]=0;
    while(!Q.empty())
    {
        int u=Q.top().second;Q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u];i;i=nxt[i])
        {
            int v=to[i],w=val[i];
            // if(vis[v])continue;
            if(dp[now][u]+w<dp[now][v])
                dp[now][v]=dp[now][u]+w,Q.push(mp(-dp[now][v],v));
        }
    }
}
signed main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=m;++i)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    for(int i=0;i<N;++i)
            dp[0][i]=0x3f3f3f3f3fll;
    Q.push(mp(0,1));
    dp[0][1]=0;
    d(0);
    for(kk=1;kk<=k;++kk)
    {
        hd=1;tl=0;
        // q[++tl]=0;
        for(int i=1;i<=n;++i)
        {
            q[0]=i;dp[kk][i]=dp[kk-1][i];
            while(hd<tl&&(Y(tl)-Y(tl-1))*(X(0)-X(tl))>=(Y(0)-Y(tl))*(X(tl)-X(tl-1)))
                --tl;
            q[++tl]=i;
        }
        for(int i=1;i<=n;++i)
        {
            int K=2ll*i;
            while(hd<tl&&(Y(hd+1)-Y(hd))<=K*(X(hd+1)-X(hd)))
                ++hd;
            int j=q[hd];
            if(dp[kk][i]>dp[kk-1][j]+(i-j)*(i-j))
            {
                dp[kk][i]=dp[kk-1][j]+(i-j)*(i-j);
                Q.push(mp(-dp[kk][i],i));
            }
        }
        d(kk);
    }
    for(int i=1;i<=n;++i)  
        cout<<dp[k][i]<<" ";
    cout<<endl;
    return 0;
}
2023/3/15 18:03
加载中...