因為可能有多個重要城市,所以我們建立乙個虛擬節點s。
只要我們理解支配樹的含義,那麼對於兩個點的時候也是一樣的。
所以問題變為s不能到達這兩個點,需要炸掉的城市個數。可以看出這裡需要建反圖。
那麼不能到達兩個點實際在支配樹上面是什麼呢?就是s到這兩個點的個數之和,這裡樹上倍增即可求出。
但是要注意,s不能炸掉,所以答案要減一。
ac**:
#pragma gcc optimize("-ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const
int n=
2e5+
10,m=n<<1;
int n,m,q;
struct dominate_tree
void
dfs(
int x)
}int
find
(int x)
void
tarjan()
add(lat,sdom[x]
,x); bel[x]
=fa[x]
; x=fa[x]
;for
(int j=lat[x]
;j;j=nex[j]
) lat[x]=0
;}for(
int i=
2,x;i<=cnt;i++)}
void
dfs_res
(int x)
}void
work()
dfs(s)
;tarjan()
; tot=0;
for(
int i=
1;i<=n;i++)if
(idom[i]
)add
(cdy,idom[i]
,i);
dfs_lca
(s,s);}
void
init
(int n)
}void
dfs_lca
(int x,
int fa)
inline
intlca
(int x,
int y)
inline
intcalc
(int x,
int y)
inline
void
solve()
}t;signed
main()
hdu 4694 支配樹模板
題意 給你n個女生的聯絡情況,第n個人是大姐大 即題目中的根 從它開始會向其他人傳送訊息,如果第y個人失聯了那麼第x個人就無法收到訊息,就稱y是x的乙個重要的姐妹,現在問你每個人的重要的姐妹的編號總和,如果不連通那麼就是0。做法 看了將近三個小時的支配樹,總算是明白了一點點了。感覺別人講的會比較透一...
1917 支配值數目
void missing you for time meet you time missing you 自從遇見了你,就不停地想你。已知f與g兩個整數陣列,元素都已經從小到大排好序,請寫乙個程式,算出f中比g中元素大的對數。換句話說,f 0 比g中多少個元素大,f 1 比g中多少個元素大等,這些值的...
軟體構造課堂延伸(2) 支配樹
在動態分析程式效能時,遇到了支配樹這個概念,下面詳細解釋一下什麼叫做支配樹。支配樹 dominator tree 支配樹展示了記憶體匯出檔案中最大的物件。支配樹是用來研究使得其它物件存活的物件的強有力工具。支配樹是將原來記憶體中的應用關係圖轉化為乙個樹形結構,這個樹形結構的特點是 所有節點的兒子節點...