一個點向一個點連邊太easy了。
現實有的時候並沒有這么簡單。
對於這樣的一類問題:
需要多次(m=1e5次左右)從一個編號在[L1,R1]的區間內的所有點,向另一個編號在[L2,R2]的所有點之間分別連權值相同的邊。
求S到T的最短路,或者其他的信息。
就是一個建圖的輔助工具。解題具體思想還是靠圖論。
暴力連邊是O(mn^2)的。時空不足。
對於區間連邊,我們考慮處理區間問題的大殺器:線段樹。
具體做法如下:
建造兩棵線段樹A,B
A保存入的信息,B保存出的信息。
到了A的某個節點,代表進入了這個點所代表的區間,位置可以認為是區間所有的包含點的疊加態。
到了B的某個節點,代表可以從這個點代表的區間中的任意一個邊出去。
連邊:
1.A樹父親向兒子連0邊,能夠進入父親節點,必然就可以選擇進入兒子節點。疊加態具體化。
2.B樹兒子向父親連0邊,兒子屬於父親節點,父親節點代表區間連出去邊,兒子節點也一定可以走。
3.A樹B樹間的平行節點之間,由A向B連0邊,代表,我進入A點,必然可以選擇從A點出去。
4.對於題目要求加入的邊(真邊),建立虛擬節點P,在B中把出區間拆成logn份,分別連接到P點,邊權為0
在A中把入區間拆成logn份,點P分別連接到這些區間,邊權都是val
(當然,邊權可以反過來)
然后跑最短路即可。
邊數:O(2*2*n+m*logn*2)
點數:O(2*2*n+m)
模板題:CF786B
當然,也要解決一些其他抽象的問題:
[POI2015]PUS
以及炸彈:
bzoj 5017 炸彈 線段樹優化建圖+tarjan+拓撲排序