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;
}