LOJ2155 Conspiracy
Conspiracy
给定一张 n 个点 m 条边的无向图,你要把 V 分为 S 和 T=V∖S 两部分,使得 S,T≠∅,且 S 是团而 T 是独立集。求方案数。
n≤5000。
题解
首先可以观察到性质:假设我们找出来了一组 S,T,那么 S 不能拿 ≥2 个点给 T,T 也不能拿 ≥2 个点给 S。
所以我们可以枚举两边交换的情况,O(n2)。
问题转化成了如何找初始时的 S,T。令 xi=1,0 分别表示 i 在团、独立集中。那么
-
i,j 有边等价于 xi∨xj=1。
-
i,j 无边等价于 xi∧xj=0。
这就是经典的2-SAT模型了。Tarjan解决即可。
CO int N=5e3+10; int e[N][N]; vector<int> to[2*N]; int pos[2*N],low[2*N],dfn; int stk[2*N],ins[2*N],top; int col[2*N],idx; void tarjan(int u){ pos[u]=low[u]=++dfn; stk[++top]=u,ins[u]=1; for(int v:to[u]){ if(!pos[v]){ tarjan(v); low[u]=min(low[u],low[v]); } else if(ins[v]) low[u]=min(low[u],pos[v]); } if(low[u]==pos[u]){ ++idx; do{ int x=stk[top]; ins[x]=0,col[x]=idx; }while(stk[top--]!=u); } } vector<int> S,T; int adj[N]; int main(){ int n=read<int>(); if(n==2){ puts("2"); return 0; } for(int i=1;i<=n;++i){ for(int j=read<int>();j--;) e[i][read<int>()]=1; for(int j=1;j<=n;++j)if(j!=i){ if(e[i][j]) to[i].push_back(j+n); else to[i+n].push_back(j); } } for(int i=1;i<=2*n;++i)if(!pos[i]) tarjan(i); for(int i=1;i<=n;++i){ if(col[i]==col[i+n]){ puts("0"); return 0; } if(col[i]<col[i+n]) T.push_back(i); else S.push_back(i); } for(int u:S)for(int v:T)if(e[u][v]) adj[u]=!adj[u]?v:-1; for(int u:T)for(int v:S)if(!e[u][v]) adj[u]=!adj[u]?v:-1; int ans=S.size() and T.size(); // edit 1 if(S.size()>1)for(int u:S) ans+=!adj[u]; if(T.size()>1)for(int u:T) ans+=!adj[u]; for(int u:S)for(int v:T) ans+=(!adj[u] or adj[u]==v) and (!adj[v] or adj[v]==u); printf("%d\n",ans); return 0; }
静渊以有谋,疏通而知事。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件