Poj1062 昂貴的聘禮 最短路加限制

2021-09-25 16:32:14 字數 2008 閱讀 2479

題意:

年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說:"嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那麼只要5000金幣就行了。「探險家就跑到大祭司那裡,向他要求皮襖或水晶球,大祭司要他用金幣來換,或者替他弄來其他的東西,他可以降低**。探險家於是又跑到其他地方,其他人也提出了類似的要求,或者直接用金幣換,或者找到其他東西就可以降低**。不過探險家沒必要用多樣東西去換一樣東西,因為不會得到更低的**。探險家現在很需要你的幫忙,讓他用最少的金幣娶到自己的心上人。另外他要告訴你的是,在這個部落裡,等級觀念十分森嚴。地位差距超過一定限制的兩個人之間不會進行任何形式的直接接觸,包括交易。他是乙個外來人,所以可以不受這些限制。但是如果他和某個地位較低的人進行了交易,地位較高的的人不會再和他交易,他們認為這樣等於是間接接觸,反過來也一樣。因此你需要在考慮所有的情況以後給他提供乙個最好的方案。

為了方便起見,我們把所有的物品從1開始進行編號,酋長的允諾也看作乙個物品,並且編號總是1。每個物品都有對應的**p,主人的地位等級l,以及一系列的替代品ti和該替代品所對應的"優惠"vi。如果兩人地位等級差距超過了m,就不能"間接交易」。你必須根據這些資料來計算出探險家最少需要多少金幣才能娶到酋長的女兒。

思路:等級限制這一塊卡住了,看了講清楚了。下面摘一段出來。

大牛的思路:對於從u點出發到w點的路徑中,他會跟很多等級的人交易,然而必須滿足在路徑中的點等級差不很超過乙個m值,那麼怎麼對這樣的問題求解呢?我沒看報告前是很疑惑的!

這個區間的確定顯然不是隨便的,那麼就要根據一定的條件了,從題意中我們知道,最後所有的最短路都會匯集在1號點,也就是說1號點是所有最短路都存在的點,好了,這個條件很重要,這樣我們就可以依照1號點來給定區間了,比如1號點等級為lev,那麼也就是說在所有最短路的這些點都必須滿足在[lev-m,lev+m]這個區間裡面。好了,可能你會迫不及待將這個區間作為最後的區間,在想想,如果在這個區間內出現的兩個點的他們之間的等級差超過了m值(這是存在的),顯然,不符合題意了,所以這個區間還有繼續縮小。其實只要稍微動動腦子,就可以找出這樣的區間[lev-m,lev],[lev-m+1,lev+1],… …,[lev,lev+m],首先這些區間都滿足大區間的條件,而且如果將這些區間的某個作為篩選條件的話,在這個區間內的任意兩個點的等級都不會超過m值,這就是很特別的地方了,我也是在這裡卡了的。

好了,講完了,只需列舉區間,然後篩選點,求最短路就行了。

#include #include #include #include #pragma comment(linker, "/stack:102400000,102400000")

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int maxn = 100+5;

using namespace std;

int l[maxn], p[maxn], x[maxn], t[maxn][maxn], w[maxn][maxn];

int g[maxn][maxn];

int d[maxn];

bool vis[maxn];

void dijkstra(int n, int s)

d[s] = 0;

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

}int main()

} int ans = inf;

// 列舉等級區間

for(int level = max(0, l[1]-m); level <= l[1]; ++level)

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

}dijkstra(n+1, n+1);

ans = min(ans, d[1]);

} printf("%d\n", ans);

} fclose(stdin);

return 0;

}

昂貴的聘禮 poj 1062 最短路

沒看好題目條件 隨便寫了個弗洛伊德就交了 實際上兩個身份差距大的人是連間接交易都不允許的 所以列舉每個等級區間並對其用dijkstra演算法找最小值 ac include include include include include include include include include ...

POJ 1062 昂貴的聘禮 最短路

假設乙個起點0,根據題目給出的權值構圖,答案就是從0到1之間的最短路。這裡要注意的是這個等級限制的問題。首先等級限制不是相鄰點之間的限制,而是整體路徑的。等級的限制可以通過假設乙個點為最低點求最短路,我假設某個點是最短路中等級最低的,然後求最短路。每列舉乙個點就求一次最短路,取最小的值。因為你列舉的...

poj 1062昂貴的聘禮(最短路)

題目 昂貴的聘禮 time limit 1000ms memory limit 10000k total submissions 61174 accepted 18489 description 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000...