HDU 3440 House Man

这是一道差分约束的题,但是本题有两个坑点

  1. INF要足够大
  2. 本题问的是距离的最大值,距离一定是正的,所以我们不能只是单纯的最短路,而要注意每个点的位置关系,即向左走为负,向右走为正。
#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;
}
posted @ 2018-01-02 09:47  Mr_Wolfram  阅读(130)  评论(0编辑  收藏  举报