hdu 3440 差分約束

2022-05-22 07:36:11 字數 1314 閱讀 8192

看完題目第一遍,感覺很簡單。當寫完程式跑測試用例的時候,發現第二個總是過不了,然後好好研究了一下測試用例,才知道原來不是程式有問題,而是我的建圖方式錯了。對於這些無序的點,如果高的在右邊,不等式是dis[tall]-dis[short]<=d;如果高的在左邊,那麼不等式就要變成dis[short]-dis[tall]<=d了。

另乙個條件就是1<= dis[i+1]-dis[i] <=d;

一定要選最高的和最低的兩個點其中最靠左邊的作為源點,那麼求一次最短路的意義就是另乙個點到它的最遠距離。

看**:

#include#include

#include

#include

#include

#define maxn 1010

#define inf 0x7fffffff

#define maxm maxn*maxn

using

namespace

std;

intdis[maxn],index[maxn],vi[maxn],e,n;

struct

edgeedge[maxm];

struct

pointp[maxn];

void

init()

}void addedge(int

from, int to ,int

val)

int bellman_ford(int

u) }

if(flag)

return1;

}return0;

}int

cmp(point a,point b)

intmain()

for(i=1;i)

sort(p+1,p+n+1

,cmp);

for(i=1;i)

else

}intu;

if(p[1].num>p[n].num)

u=p[n].num;

else

u=p[1

].num;

if(bellman_ford(u))

printf(

"case %d: %d\n

",++case,abs(dis[p[n].num]-dis[p[1

].num]));

else

printf(

"case %d: -1\n

",++case);

//for(i=1;i<=n;i++)

//coutcout<}

return0;

}

HDU 3440 查分約束

點選開啟鏈結 題意 給個n個不同的高度,乙個人從最低點跳躍,每次可以跳到第乙個比它高的位置,最後跳到最高點,然後每次最多可以跳的距離為d,而且在跳躍時可以在不改變給定順序的情況下移動這些高度,使得最後起始點和終點的位置最遠,思路 自己想了一會,想的方向錯了,我自己想的方法是將最小高度記為0,最大高度...

HDU3440 House Man(差分約束)

題意 有n個高度各不相同的房子排成一條直線,每個房子都佔據乙個點,相鄰兩個房子之間的距離可以改變,但是所有房子的相對位置不能變。有乙個超人能夠在房子之間跳躍,他從最矮的房子開始,依次跳到更高的房頂上。任意兩個高度的次序相鄰的房子之間的距離不能超過d。求最高的和最矮的房子之間的最大距離。思路 我們將房...

差分約束 hdu 3666

xij ai l bj 0 xij ai u bj 0 兩邊取對數來去除ai,bj前面的係數 有 logbj logai logxij logu logai log bj logl logxij 化成標準差分約束,建圖,spfa,注意乙個竅門,當入隊總數大於2 n m 時就可以輸出no 因為 乙個點...