題目
圓方樹其實並沒有那麼難
圓方樹的構建比較簡單,就是乙個tarjan把點雙跑出來,對於每乙個點雙我們多建乙個方點,把原圖中的點稱為圓點,將點雙內所有圓點向方點連邊,之後我們就得到了原圖的圓方樹
關於圓方樹的性質,zyb大爺在他的題解裡寫了很多,這裡就不再抄一遍了
至於這道題,就是把圓點拿出來建棵虛樹,割虛樹上的圓點就會使得點集不連通了
那麼如何求虛樹中的圓點個數呢,我們可以將圓點的點權放到其連向父親的那條邊上去,這樣統計虛樹的邊權和就好了;特殊的,當虛樹的最高點為圓點時,它連向父親的邊不在虛樹里,所以需要額外計算
**,就是tarjan板子和虛樹板子,寫起來爽就是了
**
#include#define re register
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=2e5+7;
inline int read()
struct ee[maxn<<1];
int n,m,num,pre[maxn],head[maxn],sum[maxn],cnt,pt[maxn],top[maxn];
int st[maxn],son[maxn],dfn[maxn],ans,dep[maxn],top,fa[maxn],rn;
inline int cmp(int a,int b)
}void dfs2(int x,int topf)
inline int lca(int x,int y)
namespace build e[maxn<<1];
int cnt,top,num;
int head[maxn>>1],dfn[maxn>>1],low[maxn>>1],st[maxn>>1];
inline void add_(int x,int y)
void tarjan(int x,int fa) while(st[top--]!=e[i].v);
add(x,n);
}}else if(x!=fa) low[x]=min(low[x],dfn[e[i].v]);
} inline void solve()
}int main()
} return 0;
}
SDOI2018 戰略遊戲
給定一張 n 個點 m 條邊的無向聯通圖,共有 q 次操作,每次操作選擇一些點作為關鍵點,詢問有多少個點滿足刪去該點及與其相鄰的邊後,至少有兩個關鍵點不能互相到達。n,q leq 10 5,m leq 2 cdot 10 5,sum s leq 2 cdot 10 5 還是挺簡單的。就是圓方樹 虛樹...
SDOI2018 戰略遊戲
time limit 30 sec memory limit 512 mb submit 12 solved 9 submit status discuss 省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成...
解題 SDOI2018 戰略遊戲
題面 先圓方樹然後建虛樹,答案就是虛樹大小。虛樹沒必要建出來,把原來的點的點權設為1,直接dfs序排序後相鄰點求距離加上首尾兩個點的距離,最後除以二 畫一下可以發現是正反算了兩遍 注意還要去掉詢問點和補上首尾兩個點的lca 1 include2 include3 include4 include5 ...