《昂貴的禮物》最短路思路詳解

2021-10-02 21:51:03 字數 1858 閱讀 1813

題意在這裡不再贅述.我想講的是思路。

首先我們要把這個問題反向來看.把1號人物與其他人物的關係,當成其他人物與他的關係,然後我們建立乙個虛擬的人物0,他與所有人的邊權都是所有人物的原價值.

轉化為圖的思想就是,每個人物都是圖上的點,然後兌換優惠是邊,然後我們反向建邊,通過虛擬點出發,不斷鬆弛更新到1的距離,最後這個最短的距離就是我們要的答案。

注意的是:這題還有個等級限制,所以我們列舉以每個人物的等級為下界,他們的等級+m為上界的每個區間,來得到最小的那個答案。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

int n =3*

1e6+5;

const

int m =2*

1e5+5;

#define pi acos(-1)

#define inf 1e9

#define inm int_min

#define max 205

#define pb(a) push_back(a)

#define mk(a,b) make_pair(a,b)

#define dbg(x) cout << "now this num is " << x << endl;

#define sd(a) scanf("%d",&a)

#define sld(a) scanf("%lld",&a)

#define sdd(a,b) scanf("%d %d",&a,&b)

#define sddd(a,b,c) scanf("%d %d %d",&a,&b,&c)

#define pr(a) printf("%d\n",a)

#define plr(a) printf("%lld\n",a)

#define pr_(a) printf("%d ",a)

#define _pr(a) printf(" %d",a)

int n,m,cost[

105]

[105

],cnt =

1,head[

105]

,dis[

105]

,ans = inf;

struct node

p[105];

//結構體存資訊

struct edge

e[10005];

intdjst

(int ml,

int mr)

//區間上下界}}

return dis[1]

;}void

add(

int u,

int v,

int w)

intmain()

add(

0,i,p[i]

.price)

;//虛擬點到所有人的距離就是他們自己的**

}for

(int i=

1;i<=n;

++i)

//不斷列舉區間更新

pr(ans)

;}

昂貴的聘禮 最短路

昂貴的聘禮題目 思路 看y總的提高課,自己先想了想,但是不知道區間怎麼處理,看完之後豁然開朗,每次只用處理一段區間,依次列舉區間結束之後最短的便是需要的最少花費,需要定義乙個虛擬遠點,我們用0號點來定義,問題就轉化成了0號點到1號點的最短路 具體 如下 include include using n...

昂貴的聘禮 (最短路)

傳送門 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那麼只要5000...

昂貴的聘禮 DFS 最短路

description 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,...