對 samuel 星球的探險已經取得了非常巨大的成就,於是科學家們將目光投向了 samuel 星球所在的星系——乙個巨大的由千百萬星球構成的 samuel 星系。
星際空間站的 samuel ii 巨型計算機經過長期探測,已經鎖定了 samuel 星系中 \(n\) 個星球的空間座標,並對這些星球以 \(1\) 至 \(n\) 依次編號。
一些先遣飛船已經出發,在星球之間開闢探險航線。
探險航線是雙向的,例如從 \(1\) 號星球到 \(3\) 號星球開闢探險航線,那麼從 \(3\) 號星球到 \(1\) 號星球也可以使用這條航線。
例如下圖所示:
在 \(5\) 個星球之間,有 \(5\) 條探險航線。
\(a,b\) 兩星球之間,如果某條航線不存在,就無法從 \(a\) 星球抵達 \(b\) 星球,我們則稱這條航線為關鍵航線。
顯然上圖中,\(1\) 號與 \(5\) 號星球之間的關鍵航線有 \(1\) 條:即為 \(4\leftrightarrow5\) 航線。
然而,在宇宙中一些未知的磁暴和行星的衝撞,使得已有的某些航線被破壞,隨著越來越多的航線被破壞,探險飛船又不能及時恢復這些航線,可見兩個星球之間的關鍵航線會越來越多。
假設在上圖中,航線 $4\leftrightarrow24(從 \(4\) 號星球到 \(2\) 號星球)被破壞。此時,\(1\) 號與 \(5\) 號星球之間的關鍵航線就有 \(3\) 條:\(1 \leftrightarrow 3\),\(3 \leftrightarrow 4\),\(4 \leftrightarrow 5\)。
小聯的任務是,不斷關注航線被破壞的情況,並隨時給出兩個星球之間的關鍵航線數目。現在請你幫助完成。
第一行有兩個整數,分別表示星球個數 \(n\) 和初始時的航線條數 \(m\)。
接下來 \(m\) 行,每行有兩個不相同的整數 \(u,v\),表示星球 \(u\) 和星球 \(v\) 之間存在一條航線。
接下來有若干行,每行首先給出乙個整數 \(op\),表示一次操作的型別。
若 \(op=1\),則後接兩個整數 \(u,v\),表示詢問當前 \(u,v\) 兩星球之間有多少關鍵航線。
若 \(op=0\),則後接兩個整數 \(u,v\),表示 \(u,v\) 之間的航線被破壞。
若 \(op=−1\),則表示輸入結束,後面不再存在操作。
對每個 \(op=1\) 的詢問,輸出一行乙個整數表示關鍵航線數目。
輸入
5 5
1 21 3
3 44 5
4 21 1 5
0 4 2
1 5 1
-1
輸出1
3
資料規模與約定
對於全部的測試點,保證:
\(1 \leq n \leq 3 \times 10^4,1 \leq m \leq 10^5\)
$ -1 \leq op \leq 1,1 \leq u, v \leq n$
無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。
對於 \(op=0\) 的操作,保證操作前航線 \(u \leftrightarrow v\) 存在。
詢問與破壞航線的總次數不超過 \(4 \times 10^4\)
時間逆序, 變成了加邊,
來到例題
只不過變成了兩點之間的橋
還是dfs序的好性質, 記錄dfs序和離開當前點的dfs序low, 則 x 的孩子dfs 都大於 dfn[x] 小於等於 low[x]
通過樹狀陣列巧妙維護樹形結構 x 到 樹根 的距離, 則每次詢問就是 ask(x) + ask(y) - 2 * ask(lca(x,y))
關鍵是加邊的時候 怎麼維護 x 到根的距離,
跟例題一樣, 在並查集爬樹的時候, add(dfn[x], 1), add(low[x] + 1, -1) 即可
struct stfrom
void bfs(int s) }}
int lca(int x, int y)
int dist(int x, int y)
} st;
struct node ;
int n, m, _, k, cas;
int f[n], c[n], dfn[n], low[n], df;
pii ed[m];
vectorh[n], ans;
vectore;
setes;
int ff(int x)
void add(int x, int k)
int ask(int x)
void dfs(int x, int fa)
int main()
stackst;
for (int op, x, y; cin >> op, op != -1;) ), ans.pb(0);
else st.push(), es.insert();
}rep(i, 1, m) if (!es.count(ed[i]))
if (ff(ed[i].fi) == ff(ed[i].se)) e.push_back();
else h[ed[i].fi].pb(ed[i].se), h[ed[i].se].pb(ed[i].fi), f[f[ed[i].fi]] = f[ed[i].se];
st.init(n, h); st.bfs(1); dfs(1, 0);
rep(i, 1, n) f[i] = i;// add(dfn[i], st.dep[i] - 1);
while (!e.empty()) st.push(e.back()), e.pop_back();
while (!st.empty())
else
}for (auto& i : ans) cout << i << '\n';
return 0;
}
AHOI2005 航線規劃
點此看題 題意 略 說明 提示 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。資料範圍 1 n 30000,1 m 100000,1 q 40000 1 leq n leq 30000,1 leq m leq 100000...
AHOI2005 航線規劃
給乙個n個點m條邊的圖,有兩種操作 詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。1 n 30000,1 m 100000,操作總數不超過40000 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。必經邊就是橋 ...
P1403 AHOI2005 約數研究
科學家們在samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機 samuel ii 的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用 samuel ii 進行數學研究。小聯最近在研究和約數有關的問題,他統計每個正數n的約數的個數,並以f n 來表示。例...