2022-08-15 16:53:11 +08:00

102 lines
2.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e3+5,N3=N*3,inf=0x3f3f3f3f;
int to[N3],ne[N3],w[N3],h[N],cnt=0,s=N-4,e,dist[N],been[N];
bool in[N],wa=0;
int t,n,d;
struct Point
{
int h,id;
}a[N];
void add(int u,int v,int w1)
{
to[++cnt]=v;
ne[cnt]=h[u];
w[cnt]=w1;
h[u]=cnt;
}
void spfa()
{
queue<int>q;//queue没有自带函数清零
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
in[u]=0;//spfa的精髓
for(int i=h[u];i;i=ne[i])
{
int v=to[i],w1=w[i];
// printf("%d %d %d\n",u,v,w1);
if(dist[u]+w1<dist[v])
{
dist[v]=dist[u]+w1;
been[v]++;//TLE 放错位置
if(been[v]>=n)
{
wa=1;
return;
}
// printf("%d(%d) %d(%d) %d\n",u,dist[u],v,dist[v],w1);
if(!in[v])
{
q.push(v);
in[v]=1;
}
}
}
}
}
bool cmp(Point a, Point b)
{
return a.h<b.h;
}
int main()
{
scanf("%d",&t);
for(int t1=1;t1<=t;t1++)
{
scanf("%d%d",&n,&d);
for(int i=0;i<=n;i++)
{
dist[i]=inf;
}
memset(h,0,sizeof(int)*(n+1));
memset(been,0,sizeof(int)*(n+1));
memset(in,0,sizeof(bool)*(n+1));
cnt=0;//WA罪魁祸首!
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].h);//怎么总是你&
a[i].id=i;
// add(s,i,0);
}
for(int i=1;i<n;i++)
{
// add(i,i+1,d);
add(i+1,i,-1);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<n;i++)
{
int u=a[i].id,v=a[i+1].id;
if(u>v) swap(u,v);
add(u,v,d);
// add(v,u,-1);
}
s=a[1].id<a[n].id? a[1].id:a[n].id;
e=a[1].id>a[n].id? a[1].id:a[n].id;
dist[s]=0;
wa=0;//WA 忘了
spfa();
// if(dist[e]>=inf) dist[e]=-1;
if(wa) printf("Case %d: %d\n",t1,-1);
else printf("Case %d: %d\n",t1,dist[e]);
}
return 0;
}