日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P7520-[省选联考 2021 A 卷]支配

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P7520-[省选联考 2021 A 卷]支配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P7520


題目大意

給出nnn個點mmm條邊的一張有向圖,一號點為起始點,qqq次獨立的詢問加入一條邊后有多少個點的支配集發生了變化。

1≤n≤3000,1≤m≤2×n,1≤q≤2×1041\leq n\leq 3000,1\leq m\leq 2\times n,1\leq q\leq 2\times 10^41n3000,1m2×n,1q2×104


解題思路

首先我們肯定是先建一棵支配樹,可以直接O(n2)O(n^2)O(n2)搞。

具體的做法我是從1~n1\sim n1n枚舉,然后枚舉到xxx時把xxx刪掉從111開始遍歷,如果對于一個點yyy滿足yyy不能到達且fayfa_yfay?能夠到達,那么fayfa_yfay?改為xxx即可。

然后考慮一條邊x→yx\rightarrow yxy能改變支配集的話,防止麻煩我們對于每個點xxx只考慮它的父節點faxfa_xfax?,如果1~y1\sim y1y存在一個點xxx使得faxfa_xfax?不再支配xxx,那么yyy的支配集肯定改變。

那么考慮對于一個邊x→yx\rightarrow yxy,如果存在一條路徑1→x→y→i1\rightarrow x\rightarrow y\rightarrow i1xyi且不經過iii的父節點,那么iii整個子樹的支配集都會改變,首先條件是1→x1\rightarrow x1x不經過faifa_ifai?,這個很簡單,如果xxx不在faifa_ifai?的子樹內就好了。然后是y→iy\rightarrow iyi這個條件,也很好搞,枚舉點iii,把faifa_ifai?刪去,然后看iii走反圖能到達的點,這些點都可以作為yyy,提前O(n2)O(n^2)O(n2)預處理就好了。

然后詢問的時候我們暴力枚舉所有點判斷是否合法,然后樹上差分來統計答案就好了。

時間復雜度:O(n2+nq)O(n^2+nq)O(n2+nq)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int N=3010; int n,m,q,cnt,ans,fa[N],v[N],rfn[N],ed[N]; vector<int> F[N],G[N],T[N]; bool f[N][N]; void dfs(int x){if(v[x])return;v[x]=1;for(int i=0;i<G[x].size();i++)dfs(G[x][i]);return; } void dfs2(int x){rfn[x]=++cnt;for(int i=0;i<T[x].size();i++)dfs2(T[x][i]);ed[x]=cnt;return; } void dfs3(int x){if(v[x])return;v[x]=1;for(int i=0;i<F[x].size();i++)dfs3(F[x][i]);return; } void dfs4(int x,int w){w|=v[x];ans+=w;for(int i=0;i<T[x].size();i++)dfs4(T[x][i],w);return; } int main() {scanf("%d%d%d",&n,&m,&q);for(int i=1,x,y;i<=m;i++){scanf("%d%d",&x,&y);G[x].push_back(y);F[y].push_back(x);}for(int i=1;i<=n;i++){memset(v,0,sizeof(v));v[i]=2;dfs(1);v[0]=1;for(int j=1;j<=n;j++)if(!v[j]&&v[fa[j]])fa[j]=i;}for(int i=2;i<=n;i++)T[fa[i]].push_back(i);dfs2(1);for(int i=2;i<=n;i++){memset(v,0,sizeof(v));v[fa[i]]=2;dfs3(i);for(int j=1;j<=n;j++)if(v[j]==1)f[j][i]=1;}while(q--){int x,y;ans=0;memset(v,0,sizeof(v));scanf("%d%d",&x,&y);for(int i=1;i<=n;i++){if(!f[y][i])continue;if(rfn[fa[i]]<=rfn[x]&&ed[fa[i]]>=rfn[x])continue;v[i]=1;}dfs4(1,0);printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的P7520-[省选联考 2021 A 卷]支配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。