題意在這裡不再贅述.我想講的是思路。
首先我們要把這個問題反向來看.把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金幣。如果你能夠弄來他的水晶球,...