HDU 3440 House Man

Posted Mr_Wolfram的高维空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

以上是关于HDU 3440 House Man的主要内容,如果未能解决你的问题,请参考以下文章

hdu3440 House Man 差分约束系统

hdu 3440 House Man

HDU 3440 House Man

HDOJ题目3440 House Man(差分约束)

POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

HDU 5538 House Building(模拟——思维)