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#includeusing
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 ...