BZOJ2215[Poi2011]Conspiracy——2-SAT+tarjan缩点
题目描述
Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动。国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是后勤组织在未被占领的领土上运转。但是这里出现了一个问题: 1. 后勤组织里的任意两人都必须是熟人,以促进合作和提高工作效率。 2. 同谋者的团体中任意两人都不能是熟人。 3. 每一部分都至少要有一个人。国王想知道有多少种分配方案满足以上条件,当然也有可能不存在合理方案。现在国王将这个问题交由你来解决!
输入
第一行一个整数n(2<=n<=5000)表示有n个人参与该抵抗运动,标号为1..n。 之后有n行,第i行的第一个数ki(0<=ki<=n-1)表示i认识ki个人,随后的ki个数表示i的熟人。 p.s.输入满足:如果i是x的熟人,x会在i的序列中出现同时i也会出现在x的熟人序列中。
输出
符合条件的方案总数。
样例输入
2 2 3
2 1 3
3 1 2 4
1 3
样例输出
提示
Hint 1和4分到同谋者组织,2和3为后勤组织。 2和4分到同谋者组织,1和3为后勤组织。 4单独分到同谋者组织,1和2、3为后勤组织。
为了方便假设后勤组织为A,同谋组织为B
用邻接矩阵存每个人之间的认识情况,如果两个人认识就不能都在B,如果两个人不认识就不能都在A,枚举每个人之间的认识情况来2-SAT连边。
因为对于任意两个人在两种不同的方案中,他们不能一种方案都在A,另一种方案都在B。
所以在找到任意一组不冲突方案后,只能通过只将A中一个人移到B中或只将B中一个人移到A中或只将A和B中的各一个人调换来得到其他方案。
对于每个人,我们预处理出另一个集合中与他冲突的人数,什么是冲突的人?假设x,y认识,x在A中,y在B中,那么y就是x的冲突的人,因为如果x移到B中与y冲突。
先来考虑交换两个人的方案数。
如果一个人x的冲突人数>=2显然他不能动。
如果一个人x的冲突人数=1且与他冲突的人y没有冲突人数或与他冲突的人y只有一个冲突人数且这个冲突的人就是x,那么他们两个可以交换。
假设A中没有冲突人数的人有a个,B中有b个,那么这些人随便交换,方案数是a*b。
再来考虑移动一个人的方案数。
如果一个人没有冲突人数且他当前所在集合不只有他一个人,那么他能移到对面集合。
最后还要判断最开始随便找的一个不冲突方案是否每个集合都有人。
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int k,x;
int m[5010][5010];
int vis[10010];
int dep[10010];
int low[10010];
int s[10010];
vector<int>q[10010];
int head[10010];
int to[25000010];
int next[25000010];
int top;
int t[10010];
int v[10010];
int num;
int cnt;
int tot;
int now;
int ans;
int A[5010];
int B[5010];
int a,b;
int miku[10010];
int NIE[10010];
void add(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void tarjan(int x)
{
t[++top]=x;
low[x]=dep[x]=++num;
vis[x]=1;
for(int i=head[x];i;i=next[i])
{
if(!dep[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}
else if(vis[to[i]])
{
low[x]=min(low[x],dep[to[i]]);
}
}
if(dep[x]==low[x])
{
cnt++;
do
{
now=t[top];
top--;
s[now]=cnt;
vis[now]=0;
}
while(now!=x);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%d",&x);
m[i][x]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(m[i][j])
{
add(i+n,j);
add(j+n,i);
}
else
{
add(i,j+n);
add(j,i+n);
}
}
}
for(int i=1;i<=2*n;i++)
{
if(!dep[i])
{
tarjan(i);
}
}
for(int i=1;i<=n;i++)
{
if(s[i]==s[i+n])
{
printf("0");
return 0;
}
if(s[i]<s[i+n])
{
A[++a]=i;
}
else
{
B[++b]=i;
}
}
if(a&&b)
{
ans++;
}
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
if(m[A[i]][B[j]])
{
NIE[A[i]]++;
miku[A[i]]=B[j];
}
}
}
for(int i=1;i<=b;i++)
{
for(int j=1;j<=a;j++)
{
if(!m[B[i]][A[j]])
{
NIE[B[i]]++;
miku[B[i]]=A[j];
}
}
}
for(int i=1;i<=n;i++)
{
if(NIE[i]==1)
{
if(NIE[miku[i]]==1&&miku[i]>i&&miku[miku[i]]==i)
{
ans++;
}
else if(!NIE[miku[i]])
{
ans++;
}
}
}
int t1=0;
int t2=0;
for(int i=1;i<=n;i++)
{
if(!NIE[i])
{
if(s[i]<s[i+n]&&a>1)
{
ans++;
}
if(s[i]>s[i+n]&&b>1)
{
ans++;
}
if(s[i]<s[i+n])
{
t1++;
}
else
{
t2++;
}
}
}
ans+=t1*t2;
printf("%d",ans);
}
BZOJ2215[Poi2011]Conspiracy——2-SAT+tarjan缩点的更多相关文章
- # bzoj2215: [Poi2011]Conspiracy 2-sat
bzoj2215: [Poi2011]Conspiracy 2-sat 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2215 思路 一个点的 ...
- bzoj2215: [Poi2011]Conspiracy
Description Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动.国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是 ...
- hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)
#1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- King's Quest —— POJ1904(ZOJ2470)Tarjan缩点
King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...
- 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1638 Solved: 433[Submit][Statu ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1685 Solved: 724[Submit] ...
- BZOJ 1051 受欢迎的牛(Tarjan缩点)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4573 Solved: 2428 [Submit][S ...
随机推荐
- (转)vim中多行注释
1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式; 2. 在行首使用上下键选择需要注释的多行; 3. 按下键盘(大写)“I”键,进入插入模式: ...
- Skyline从5.1升级版本到6.5的常见接口变化问题
1.原来Route对象升级成Presentation对象后,激活方法的变化: 原来5.1版本示例代码: function flyto(thisa) { var thisid = thisa.id; v ...
- python制作电脑定时关机办公神器,另含其它两种方式,无需编程!
小编本人目前就是在电脑面前工作,常常会工作到凌晨两三点还在为自己的梦想奋斗着.有时在办公椅上就稀里糊涂睡着了,我相信有很多朋友和我一样,这样是很不好的.第一对身体不好,第二对电脑不好. 对身体 ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- ListView 控件和 INotifyPropertyChanged 接口
原文:ListView 控件和 INotifyPropertyChanged 接口 ListView 控件和 DataGridView 控件 ListView 是跟 Winform 中 DataGri ...
- 【转】分布式一致性算法:Raft 算法(Raft 论文翻译)
编者按:这篇文章来自简书的一个位博主Jeffbond,读了好几遍,翻译的质量比较高,原文链接:分布式一致性算法:Raft 算法(Raft 论文翻译),版权一切归原译者. 同时,第6部分的集群成员变更读 ...
- 腾讯云COS体验
其实这篇文章本来是推荐COS的,写了一半发现COS的免费额度取消了,2019年之后的开通的用户免费6个月,老用户不受影响,这还让我怎么推荐啊?!写都写了,删掉岂不是白浪费时间? 都怪你!腾讯云! 起因 ...
- 写入mssql出现乱码
1.出现乱码的场景如下: --------------------------------------------------------------------------------------- ...
- <<架构漫谈>>读后感
今天按照老师的要求,看了架构漫谈1--9讲,觉得受益良多,以下是我得点点读后感: (一)什么是架构? 架构的英文是Architecture,从定义上看,架构好像是一个过程,也不是很清晰.下面从架构的缘 ...
- my项目的总结2015.8.26编
这已经是上上个星期的事了,现在回顾一下: 负责的模块是"my",更精准的说应该是my里面的个人信息管理 由于项目分域,模块已经分好了,涉及到的只是在现有的基础上解决分域后遗留的历史 ...