傳說中的暗之連鎖被人們稱為 dark。
dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。
經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。
dark 有 n – 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主要邊構成的路徑。
另外,dark 還有 m 條附加邊。
你的任務是把 dark 斬為不連通的兩部分。
一開始 dark 的附加邊都處於無敵狀態,你只能選擇一條主要邊切斷。
一旦你切斷了一條主要邊,dark 就會進入防禦模式,主要邊會變為無敵的而附加邊可以被切斷。
但是你的能力只能再切斷 dark 的一條附加邊。
現在你想要知道,一共有多少種方案可以擊敗 dark。
注意,就算你第一步切斷主要邊之後就已經把 dark 斬為兩截,你也需要切斷一條附加邊才算擊敗了 dark。
第一行包含兩個整數 n 和 m。
之後 n – 1 行,每行包括兩個整數 a 和 b,表示 a 和 b 之間有一條主要邊。
之後 m 行以同樣的格式給出附加邊。
輸出乙個整數表示答案。
n≤100000,m≤200000,資料保證答案不超過231−1
4 1
1 2
2 3
1 4
3 4
```text
輸出樣例:
```text
3
附加邊會產生環,
對於環外的邊直接斬斷, 附加邊隨便
對於環上的邊, 如果這條邊在兩個環以上, 那麼要站短多條附加邊才可, 貢獻為零
對於環上, 只在乙個環上, 那麼就斬掉這條邊, 再把響應附加邊斬斷, 貢獻為1
那就統計每條邊在多少個環上唄, 附加邊連線 (x, y), 那麼 x, y 到 lca(x, y)上的邊環數+1
我們直接樹上差分, 讓 x, y的 value + 1, lca(x, y)的 value -= 2, 深度遍歷算就行了
#include #define all(n) (n).begin(), (n).end()
#define se second
#define fi first
#define pb push_back
#define mp make_pair
#define sqr(n) (n)*(n)
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define io ios::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
typedef pairpii;
typedef pairpll;
typedef vectorvi;
typedef double db;
const int n = 1e5 + 5;
int n, m, _, k, t;
int h[n], to[n << 1], ne[n << 1], co[n << 1], tot;
int f[n][20], d[n], dist[n], cnt[n];
queueq;
void add(int u, int v, int c)
void bfs(int s)
}}int lca(int x, int y)
void dfs(int u, int fa)
}int main()
bfs(1);
rep (i, 1, m)
dfs(1, 0);
cout << k;
return 0;
}
暗 鎖(樹上差分)
傳說中的暗之連鎖被人們稱為 dark。dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。dark 有 n 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主...
Lca 樹上差分
暗 鎖 color 如圖,如何使標記的邊的覆蓋次數 c 我們把邊權看成是其子樹下所有點權之和,如果我需要增加x到p與y到p之間的邊權,p lca x,y 那麼只需要將x標記為x c,y標記為y c,p標記為p 2c 做完以上的操作,最後對整個樹求一遍dfs即可,該過程模擬於求字首和 include ...
acwing352樹上差分 lca
主要題意就是先給你乙個最小生成樹然後一些附加的邊 你要從最小生成樹里取一條邊 然後附加邊裡取一條 使 這個連通塊分成兩個連通塊 首先來看看樣例 三種取法 是圖中的三種顏色的取法法 如果圖變成這個樣子 要使圖從 1 2這條邊 變成兩個連通塊 你會發現 1 2 4 1 是乙個環 1 2 3 4 1又是乙...