这是一道差分约束的题,但是本题有两个坑点
- INF要足够大
本题问的是距离的最大值,距离一定是正的,所以我们不能只是单纯的最短路,而要注意每个点的位置关系,即向左走为负,向右走为正。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <cstdlib> #define RST(a) memset((a),0,sizeof((a))) using namespace std; const int MAXN=2005; int init(){ int rv=0,fh=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); } while(c>='0'&&c<='9'){ rv=(rv<<1)+(rv<<3)+c-'0'; c=getchar(); } return rv*fh; } int T,n,d,head[MAXN],nume,dis[MAXN]; bool f[MAXN]; struct house{ int h,num; }a[MAXN]; struct edge{ int to,nxt,dis; }e[MAXN<<3]; bool cmp(house a,house b){ return a.h<b.h; } void adde(int from,int to,int dis){ e[++nume].to=to; e[nume].dis=dis; e[nume].nxt=head[from]; head[from]=nume; } bool dfs_SPFA(int u){ f[u]=1; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; int dii=e[i].dis; if(dis[v]>dis[u]+dii){ dis[v]=dis[u]+dii; if(f[v]) return 1; if(dfs_SPFA(v)) return 1; } } f[u]=0; return 0; } int main(){ freopen("in.txt","r",stdin); T=init(); int cnt=0; while(T--){ cnt++; n=init();d=init(); for(int i=1;i<=n;i++){ a[i].h=init();a[i].num=i; } sort(a+1,a+n+1,cmp); RST(head);RST(e);nume=0;RST(f); for(int i=1;i<n;i++){ int ma=max(a[i].num,a[i+1].num),mi=min(a[i].num,a[i+1].num); adde(mi,ma,d); adde(i+1,i,-1); } memset(dis,0x7f,sizeof(dis)); int s=min(a[1].num,a[n].num),en=max(a[1].num,a[n].num); dis[s]=0; /*for(int i=2;i<=n;i++){ adde(a[1].num,a[i].num,0x3f3f3f3f-1); }*/ /*int u=a[1].num; for(int i=head[u];i;i=e[i].nxt) cout<<e[i].to<<endl; */ printf("Case %d: ",cnt); bool fff=0; if(dfs_SPFA(s)) printf("-1\n"); else printf("%d\n",dis[en]); } fclose(stdin); return 0; }