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

1|0正题

题目链接:https://www.luogu.com.cn/problem/P7520


1|1题目大意

给出n个点m条边的一张有向图,一号点为起始点,q次独立的询问加入一条边后有多少个点的支配集发生了变化。

1n3000,1m2×n,1q2×104


1|2解题思路

首先我们肯定是先建一棵支配树,可以直接O(n2)搞。

具体的做法我是从1n枚举,然后枚举到x时把x删掉从1开始遍历,如果对于一个点y满足y不能到达且fay能够到达,那么fay改为x即可。

然后考虑一条边xy能改变支配集的话,防止麻烦我们对于每个点x只考虑它的父节点fax,如果1y存在一个点x使得fax不再支配x,那么y的支配集肯定改变。

那么考虑对于一个边xy,如果存在一条路径1xyi且不经过i的父节点,那么i整个子树的支配集都会改变,首先条件是1x不经过fai,这个很简单,如果x不在fai的子树内就好了。然后是yi这个条件,也很好搞,枚举点i,把fai删去,然后看i走反图能到达的点,这些点都可以作为y,提前O(n2)预处理就好了。

然后询问的时候我们暴力枚举所有点判断是否合法,然后树上差分来统计答案就好了。

时间复杂度:O(n2+nq)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16138537.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示