構造物品的最小花費

2021-07-24 17:03:58 字數 1344 閱讀 4830

2 . dwarf tower

(dwarf.cpp/c/pas)

【問題描述】

vasya在玩乙個叫做"dwarf tower"的遊戲,這個遊戲中有n個不同的物品,

它們的編號為1到n。現在vasya想得到編號為1的物品。

獲得乙個物品有兩種方式:

1. 直接購買該物品,第i件物品花費的錢為ci

2. 用兩件其他物品合成所需的物品,一共有m種合成方式。

請幫助vasya用最少的錢獲得編號為1的物品。

【輸入格式】

第一行有兩個整數n,m(1<=n<=10000,0<=m<=100000),分別表示有n種物品以

及m種合成方式。

接下來一行有n個整數,第i個整數ci表示第i個物品的購買**,其中

0<=ci<=10^9。

接下來m行,每行3個整數ai,xi,yi,表示用物品xi和yi可以合成物品ai,其

中(1<=ai,xi,yi<=n; ai<>xi, xi<>yi, yi<>ai)

【輸出格式】

一行,乙個整數表示獲取物品 1 的最少花費。

輸入樣例:  輸出樣例:

5 35 0 1 2 5

5 2 3

4 2 3

1 4 5

2【資料規模與約定】

60%的資料,n<=100

100%的資料,n<=10000,m<=100000

分析:

巧妙地建圖。我們設立0號點,向每個點連d[i]的邊,然後合成則是在xi和ai,yi和ai之間連d[yi],和d[xi]的邊。然後spfa,注意這個合成所連的邊動態的,所以我們記錄邊時,選擇使用對應得標號,而不是直接的值。

#include#include#includeusing namespace std;

const int maxn=211000;

queueq;

bool inq[maxn];

int a[maxn];

struct edgee[maxn];

int nodecnt=0,m,n;

int d[maxn];

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

void spfa()

while (!q.empty())

} }}int main(){

freopen("dwarf.in","r",stdin);

freopen("dwarf.out","w",stdout);

scanf("%d%d",&n,&m);

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

scanf("%d",&d[i]);

for (int i=0;i

最小花費 Dijkstra

原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...

砍樹最小花費

題意 有n種樹,每種樹給出高度h,砍掉每顆樹的花費c,每種樹的數量p,現在要砍掉一些樹,使得最高的樹的數量超過所有樹的一半,問最小花費。不同種類的樹高度可能相同 題解 列舉不同的高度,把高於它的樹都砍掉,然後比它矮的樹挑便宜的砍,使得該高度的樹佔所有樹的1 2 1。給樹按高度排序,首先可以用字尾和預...

題目1086 最小花費

題目描述 在某條線路上有n個火車站,有三種距離的路程,l1,l2,l3,對應的 為c1,c2,c3.其對應關係如下 距離s 票價 0l1l2輸入保證0每兩個站之間的距離不超過l3。當乘客要移動的兩個站的距離大於l3的時候,可以選擇從中間乙個站下車,然後買票再上車,所以乘客整個過程中至少會買兩張票。現...