看完題目第一遍,感覺很簡單。當寫完程式跑測試用例的時候,發現第二個總是過不了,然後好好研究了一下測試用例,才知道原來不是程式有問題,而是我的建圖方式錯了。對於這些無序的點,如果高的在右邊,不等式是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 因為 乙個點...