習題 codevs 1519 過路費 解題報告

2021-09-08 07:44:39 字數 2609 閱讀 2065

今天拿了這道題目練練手,感覺自己**能力又增強了不少;

我的思路跟別人可能不一樣。

首先我們很容易就能看出,我們需要的邊就是最小生成樹演算法kruskal演算法求出來的邊,其餘的邊都可以刪掉,於是就有了這個kruskal選邊建圖的過程。

1

struct

kruskalsolvekr[maxm];

此處省略的內容接下來會有給出全部**

4int find(intx)8

void kruskal_check(int

m)14

for(int i = 1;i <= m;++i)26}

27 }

做到這裡,有人可能覺得接下來乙個lca接著就可以ac了,不過蒟蒻認為這樣做效率有點低,然後**也不怎麼好寫,於是換成了樹鏈剖分+線段樹模板維護查詢區間最大值的思路。(什麼思路!!明明是套板子……這要解釋的話就比較尷尬了)

這樣的話效率就是o(nlogn)的總效率,感覺不錯,但是就是**量稍微有點大,請讀者見諒。

建議大家還是先去學一下樹鏈剖分的思路和板子,然後在看我的題解,畢竟光copy別人的,自己時間長了肯定忘,最好的還是自己懂了思路然後再自己手碼出來。

廢話不說了,上**

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7const

int maxn = 10005,maxm = 100005;8

intn,m,q,s,t;

9int

id[maxn],top[maxn],son[maxn],fa[maxn],h[maxn],cnt,siz[maxn],dep[maxn],val[maxn],num,f[maxn];

10struct

kruskalsolvekr[maxm];

13struct

edgeedges[maxn<<1

];16

struct

segtreetr[maxm<<1

];19

int e[maxn][3

];20

bool

cmp(kruskalsolve a,kruskalsolve b)

23void

init()

37void addedge(int u,int

v)41

int find(int

x)45

void kruskal_check(int

m)51

for(int i = 1;i <= m;++i)63}

64}65void dfs1(int now ,int father ,int

d)77}78

void getpos(int now,int

tp)87}88

void push_up(int

v)91

void build(int l,int r,int

now)

98int mid = (l + r) >> 1

;99 build(l,mid,now<<1

);100 build(mid+1,r,now<<1|1

);101

push_up(now);

102}

103int query(int x,int l,int

r)107

int ans = 0

;108

int mid = (tr[x].l + tr[x].r) >> 1

;109

if(l <= mid)ans = max(ans,query(x<<1

,l,r));

110if(r > mid)ans = max(ans,query(x<<1|1

,l,r));

111return

ans;

112}

113int youth(int u,int

v)120

if(u == v)return

ans;

121if(dep[u] >dep[v])swap(u,v);

122 ans = max(ans,query(1

,id[son[u]],id[v]));

123return

ans;

124}

125int

main()

131kruskal_check(m);

132 dfs1(1,-1,1

);133 getpos(1,1

);134

for(int i = 1;i < n;++i)

138 build(1,n,1

);139 scanf("

%d",&q);

140for(int i = 1;i <= q;++i)

144return0;

145 }

這次寫的解題報告就到這裡吧,以後會盡量去寫。

posted @

2016-05-29 16:06

小鋼釘丶coding 閱讀(

...)

編輯收藏

習題 codevs 1519 過路費 解題報告

今天拿了這道題目練練手,感覺自己 能力又增強了不少 我的思路跟別人可能不一樣。首先我們很容易就能看出,我們需要的邊就是最小生成樹演算法kruskal演算法求出來的邊,其餘的邊都可以刪掉,於是就有了這個kruskal選邊建圖的過程。1 struct kruskalsolvekr maxm 此處省略的內...

codevs1519 過路費 最小生成樹 LCA

時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 在某個遙遠的國家裡,有 n個城市。編號為 1,2,3,n。這個國家的 修建了m 條雙向道路,每條道路連線著兩個城市。規定從城市 s 到城市t需要收取的過路費為所經過城市之間道路長度的最大值。如 a到b長度為 2,b到c 長...

過路費 (最短路)

問題描述 有一天你來到了乙個奇怪的國家,它有 n 個城市,城市之間有若干條雙向道路連線,每條道路都有一定的費用,經過城市也要一定的費用。從乙個城市到達另乙個城市的總花費為路徑上費用最大的城市費用 包括起點和終點 加上路徑上所有的道路的費用。給出 q 次詢問,分別回答每次詢問中兩城市間的最少花費。保證...