SCOI2012 滑雪與時間膠囊

2022-05-03 09:45:26 字數 1883 閱讀 8845

time limit: 50 sec  memory limit: 128 mb

submit: 2362  solved: 821

[submit][status][discuss]

膠囊消耗的情況下,以最短滑行距離滑到盡量多的景點的方案(即滿足經過景點數最大的前提下使得滑行總距離最小)。你能幫他求出最短距離和景點數嗎?

輸入的第一行是兩個整數n,m。

接下來1行有n個整數hi,分別表示每個景點的高度。

接下來m行,表示各個景點之間軌道分布的情況。每行3個整數,ui,vi,ki。表示

編號為ui的景點和編號為vi的景點之間有一條長度為ki的軌道。

輸出一行,表示a180285最多能到達多少個景點,以及此時最短的滑行距離總和。 

3 3

3 2 1

1 2 1

2 3 1

1 3 10

3 2

【資料範圍】 

對於30%的資料,保證 1<=n<=2000 

對於100%的資料,保證 1<=n<=100000 

對於所有的資料,保證 1<=m<=1000000,1<=hi<=1000000000,1<=ki<=1000000000。

題解:(摘自聲亦香)(並不會證明)要是考場上能猜到這種結論就好了

因為只能從高處到低處,所以無向邊可以當有向邊看待,然後按照題目意思就是給你乙個有向圖,求乙個最小樹形圖,然後如果你用朱劉演算法來算,就只能得到70分。

這道題具有與其餘最小樹形圖不一樣的地方:點有高度!難道高度只是拿來轉化為有向邊嗎?當然不是。

回想kruskal為什麼不能求最小樹形圖?因為每次找的最小邊是有向的,所以演算法完成之後不能保證根可以到兒子,有可能有反向邊!

但是這道題的反向邊只會在高度相同的點之間出現。如果把邊先按終點高度排序為第一關鍵字,邊長為第二關鍵字排序之後,就會保證優先到高點,同高點之間選小邊,然後就不會出現反向的情況,所以可以用kruskal實現用o(mlog(m))的時間複雜度解決這道題。

#include#include

using

namespace

std;

const

int n=1e5+5

;const

int m=2e6+5

;struct dataf[m];

struct edgee[m];int

tot,head[n];

int n,m,cnt,h[n],q[n],a[m],b[m],c[m],fa[n];bool

vis[n];

inline

intread()

while(ch>='

0'&&ch<='9')

returnx;}

inline

void add(int x,int

y)int find(int

x)inline

bool cmp(const data &a,const data &b)

inline

void

bfs()}}

printf(

"%d

",t);

}inline

void

kruskal()

sort(f+1,f+cnt+1

,cmp);

long

long ans=0

;

for(int i=1,fx,fy,k=0;i<=cnt;i++)

}printf(

"%i64d\n

",ans);

}int

main()

bfs();

kruskal();

return0;

}

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

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

SCOI2012 滑雪與時間膠囊 (最小生成樹)

題目描述 輸入的第一行是兩個整數n,m。接下來1行有n個整數hi,分別表示每個景點的高度。接下來m行,表示各個景點之間軌道分布的情況。每行3個整數,ui,vi,ki。表示編號為ui的景點和編號為vi的景點之間有一條長度為ki的軌道。輸出描述 輸出一行,表示a180285最多能到達多少個景點,以及此時...

2753 SCOI2012 滑雪與時間膠囊

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