今天拿了這道題目練練手,感覺自己**能力又增強了不少;
我的思路跟別人可能不一樣。
首先我們很容易就能看出,我們需要的邊就是最小生成樹演算法kruskal演算法求出來的邊,其餘的邊都可以刪掉,於是就有了這個kruskal選邊建圖的過程。
1struct
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 6using
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 次詢問,分別回答每次詢問中兩城市間的最少花費。保證...