P2573 SCOI2012 滑雪 題解

2022-04-02 13:22:23 字數 1937 閱讀 9510

下午花了三個小時肝這道題,心態差點**!

下面是分析:

1

題目要求:

2求最小生成樹3但是

4 - a是從1號點開始的 -->如果以後的某個點比一號高,則不可能到達

5 -a只能從高往低處滑

6 - 可能某兩個景點沒有軌道連線 -->沒有處在乙個聯通快裡?78

生成樹的要求:

9 -樹根高度最大

10 -子節點的高度必須比父親結點小

11 -邊權和盡可能小

1213

自己造的樣例:

14輸入:154

41642

31171

23182

32192

44203

412122

輸出:23

37

從題解上爬的solotion:

1

為保證我們只會由高到低,我們就只建立由高向低的單向邊即可。23

對於建立出來的圖a,由1點開始寬搜,將擴充套件到的點和邊加入乙個新圖b,

4所有擴充套件到的點便是能到達的最多點。56

我們再在這個新圖上跑kruskal求最小生成樹,求得最短距離。78

對於排序部分,為保證有盡可能多的點在最小生成樹里,

9我們按終點的高度為第一關鍵字從大到小排序,邊長為第二關鍵字從小到大排序;

1011 這樣就能保證拓展的點最多,進而再用最小生成樹求最短距離。

最終ac**:

1/*2

work by:suzt_ilymtics3*/

4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int maxn=1e5+5;10

const

int maxm=1e6+6;11

struct

edgee_a[maxm << 1],e_b[maxm << 1

];15

inthead_a[maxn],num_edge_a;

16int

num_edge_b;

17int

n,m,cnt;

18long

long

ans;

19int

h[maxn],f[maxn];

20bool

vis[maxn];

21 queueq;

2223

int find(int x)

2425

bool cmp(edge x,edge y)

2627

void add_a(int

from,int to,int

w)34

35void add_b(int

from,int to,int

w)40

41void bfs(int

x)52}53

}54}55

56void

kls()64}

65}6667

intmain()

6873

for(int i=1,u,v,w;i<=m;++i)

78 bfs(1

);79 sort(e_b+1,e_b+num_edge_b+1

,cmp);

80kls();

81 printf("

%d %lld

",cnt+1

,ans);

82return0;

83 }

the end

(這篇文章終於能看了點)

SCOI2012 滑雪與時間膠囊

time limit 50 sec memory limit 128 mb submit 2362 solved 821 submit status discuss 膠囊消耗的情況下,以最短滑行距離滑到盡量多的景點的方案 即滿足經過景點數最大的前提下使得滑行總距離最小 你能幫他求出最短距離和景點數嗎...

2753 SCOI2012 滑雪與時間膠囊

time limit 50 sec memory limit 128 mb submit 2274 solved 793 submit status discuss a180285非常喜歡滑雪。他來到一座雪山,這裡分布著m條供滑行的軌道和n個軌道 之間的交點 同時也是景點 而且每個景點都有一編號i ...

生成樹 SCOI 2012 滑雪與時間膠囊

題意 乙個圖,每個點有乙個高度hi h i,邊有邊權。從 1 1 號點開始,每次從 i role presentation style position relative ii走到 j j 當且僅當存在一條 i role presentation style position relative ii...