昂貴的聘禮
題目大意是說有n個物品,每個物品都有自己的**,但同時某些物品也可以由其他的(可能不止乙個)替代品,這些替代品的**比較「優惠」,問怎麼樣選取可以讓你的花費最少來購買到物品1
由於有n個物品,我們就可以把它們看作是n個點,從其他點到他的優惠關係視做邊,又因為最後總是要找到物品1,所以可以看作是從起點0,到將物品1作為終點的最小路勁。然後由於題目是說,這條路勁上不能有兩個的等級差超過m,所以我們可以列舉最小等級,將每個點視作最小等級,這樣的話就不會掉解。
又由於我們是列舉的最小等級,所以源點0到其他每個點的邊的權值就要賦值為那個點的**,降等級比最小等級要大,或者差距大於m的其他點標記為不合法(也就是不可以走),然後在從合法的路勁中找出最小花費。
1 #include2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9 #include10 #include11
using
namespace
std;
12#define max(a,b) (a > b ? a : b)
13#define min(a,b) (a < b ? a : b)
14#define mem(a) memset(a,0,sizeof(a))
15#define maxn 105
16#define inf 1000000007
1718
intprice[maxn],edge[maxn][maxn],level[maxn];
19int
vis[maxn], d[maxn];
20int
n,m,ans;
2122
void
init()
2331}32
}3334void
read()
3545 edge[0][i] =price[i];46}
47}4849
intdijkstra()
5059
return d[1];//
這裡找到的最小值是未知起點的最小值60}
6162
intmain()
6377
int now =dijkstra();
78 ans =min(ans, now);79}
80 printf("
%d\n
", ans);81}
82return0;
83 }
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...