題意:有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...