zoukankan      html  css  js  c++  java
  • 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
    ");
    		else printf("%d
    ",dis[en]);
    	}
    	fclose(stdin);
    	return 0;
    }
    
  • 相关阅读:
    Pandas中dataframe以及spark中rdd使用groupByKey进行合并
    Apriori算法Python实现
    安装Cloudera CDH
    HDFS常用命令
    vuex modules 命名空间
    sessionStore使用
    indexof使用
    vue 简单购物车实现
    etCapture() 和 ReleaseCapture()的用法
    js组合继承与寄生继承
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8175786.html
Copyright © 2011-2022 走看看