HDU3440 House Man(差分約束)

2021-08-22 06:06:01 字數 2134 閱讀 8061

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

思路:我們將房子按照高度次序編號,最矮的為0,最高的是n-1,設si為房子i在直線上的座標,要求的是max(

如果最高的房子在s0的右邊,則答案就是max(sn-1),此時需要跑最短路;否則sn-1將會是個負數,答案就成了min(sn-1),需要跑最長路。為了方便計算,如果sn-1在s0的左邊,我們就將整個陣列做一次翻轉,這樣無論哪種情況,只需要跑最短路求max即可。

(ps:看別人的部落格學了個更簡便的方法:我們只需要比較最高的樓和最矮的樓的下標,如果矮樓在前面,以它為起點,置dis[0] = 0,求到最高樓的最短路 dis[n - 1] 即可;如果高樓在前面,那麼就以高樓為起點,置dis[n - 1]為0,求dis[0]即可)

然後就是建立差分約束系統:

設j為每個房子在陣列中的原順序(j = 0,1,2,...,n-1),rk[j]為房子j排序後的序號(rk[j] = 0,1,2,...,n-1),s(x)為房子x在直線省的座標,則有:

s(rk[j]) >= s(rk[j - 1]) + 1,(j = 1,2,...,n-1)

設i為每個房子按高度公升序排列後的序號(i = 0, 1, 2,...,n-1),id[i]為每個房子在原陣列中的下標(id[i] = 0,1,2,...,n-1),

s(rk[j]) <= s(rk[j] - 1) + d,(id[rk[j]] > id[rk[j] - 1])

s(rk[j] - 1) <= s(rk[j]) + d,(id[rk[j]] < id[rk[j] - 1]),rk[j] = 1,2,...,n-1。

有點繞,但是不是很難想明白。用不等式建圖跑最短路即可,spfa判負環。

鄰接矩陣陣列開小了,t了好幾發= =

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int maxn = 1005;

struct edgg[maxn << 2];

int tot, pre[maxn];

int n, times[maxn], mx, mn;

ll dis[maxn], d;

bool vis[maxn];

void add(int u, int v, ll w)

struct node p[maxn];

bool cmp1(struct node &a, struct node &b)

bool cmp2(struct node &a, struct node &b)

ll spfa()

queueque;

que.push(0);

dis[0] = 0;

times[0] = 1;

vis[0] = true;

while (!que.empty())

que.push(v);}}

}}

return dis[n - 1];

}int main()

if (p[i].h < p[mn].h)

}if (mx < mn)

}sort(p, p + n, cmp1);

for (int i = 0; i < n; ++i)

for (int i = 1; i < n; ++i) else

}sort(p, p + n, cmp2);

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

printf("case %d: %lld\n", ++cas, spfa());

}return 0;

}

hdu 3440 差分約束

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

HDU4598 Difference(差分約束)

題意 有乙個圖,給圖上每個頂點都賦乙個實數ai。如果存在乙個正整數t滿足下面兩個條件,這個圖就是乙個 difference 1.ai t。2.如果點i,j構成的邊在圖中存在,則 ai aj t 否則 ai aj 代表充要條件 給出圖,問這個圖是否是乙個 difference 思路 結合前兩個條件,顯...

BZOJ HNOI2005 狡猾的商人(差分約束)

time limit 10 sec memory limit 162 mb submit 4969 solved 2496 submit status discuss 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai...