題目鏈結:
中文題目,就不說題意了.
分析:很好的一道題。兩個關鍵:一是建圖,而是處理等級限制的問題。
建圖的話,結點為每件物品,把探險者也看成乙個入度為零的節點,是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...