Processing math: 100%

LOJ2155 Conspiracy

Conspiracy

给定一张 n 个点 m 条边的无向图,你要把 V 分为 ST=VS 两部分,使得 S,T,且 S 是团而 T 是独立集。求方案数。

n5000

题解

首先可以观察到性质:假设我们找出来了一组 S,T,那么 S 不能拿 2 个点给 TT 也不能拿 2 个点给 S

所以我们可以枚举两边交换的情况,O(n2)

问题转化成了如何找初始时的 S,T。令 xi=1,0 分别表示 i 在团、独立集中。那么

  • i,j 有边等价于 xixj=1

  • i,j 无边等价于 xixj=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;
}

posted on   autoint  阅读(116)  评论(0编辑  收藏  举报

编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

导航

点击右上角即可分享
微信分享提示