POJ 1062 昂貴的聘禮 帶限制的最短路

2022-05-29 11:30:25 字數 1683 閱讀 6090

題目鏈結:

中文題目,就不說題意了.

分析:很好的一道題。兩個關鍵:一是建圖,而是處理等級限制的問題。

建圖的話,結點為每件物品,把探險者也看成乙個入度為零的節點,是n + 1結點之一,我把他的標號設為0,探險者到其他物品的直接連線的權值為物品的原始**,其他 i -> j的邊的權值為探險者獲得i後換j的***格。

題目又要求最短路中的所有點的等級在乙個區間內[a,b],如果能夠很好的給出這個區間的話,只要對圖中的點進行篩選即可了。

從題意中我們知道,最後所有的最短路都會匯集在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 #include #include #include #include #include #include #include #include #define mid(x,y) ((x+y)>>1)

#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

const int sup = 0x7fffffff;

const int inf = -0x7fffffff;

const int maxe = 5000;

const int maxv = 103;

struct substitutes;

struct conditioncon[maxv];

struct nodeedge[maxe];

int cnt, head[maxv];

void init()

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

int n, m;

int dis[maxv];

int vis[maxv];

priority_queue , vector>, greater> > pq;

void dijkstra(int s)

vis[0] = 0;

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

dis[i] = sup;

dis[s] = 0;

while(!pq.empty())

pq.pop();

pq.push(make_pair(0, s));

while(!pq.empty())}}

}ans = min(ans, dis[1]);

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

}int main()

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

dijkstra(0);

return 0;

}

poj 1062 昂貴的聘禮

這個題是乙個簡單的樹形dp,只是有乙個地位差限制,可以列舉可行區間,在可行區間裡進行dp.include include include include include include include include include include includeusing namespace st...

poj1062 昂貴的聘禮

做這題代價確實很昂貴,從昨天晚上一直到今天上午都在debug,今天上午提交還出現各種wa。比較明顯的最短路,有幾個地方要注意一下,首先建圖有個地方要注意以下,這題是用臨界矩陣儲存的有向圖,而且是由交換品指向購買品,然後將虛節點設為購買品的價值,最後列舉每乙個可能地位區間di求最短路,因為對於區間 c...

昂貴的聘禮(POJ1062)

這個玩了好久啊,是我第一次寫出這樣的最短路徑。還是參考了其它人的才出來,注意的有 1 是單向圖,2 把不滿足權值的提前全初始化。其實不用topo排序也可的。關鍵 void dfs int k include include include include include include includ...