首页 > 其他分享 >sat计数问题

sat计数问题

时间:2023-07-07 17:11:06浏览次数:28  
标签:cnt 认识 int ans 阵营 计数问题 sat

/*
先是建图,跑一次缩点
建立一个最初的阵营
加上0代表认识,1代表不认识
ans=0

因为划分了两个独立的阵营,所以一次是只能交换一个人的 

如果对方阵营我只认识一个,并且我认识的哪一个可以来到我的阵营,那么就将两者进行交换(0,1) 
 
如果对方阵营的我都不敌对,或不认识,那我就可以直接过去(0直接过去一个人) 
 
 
这个统计的问题,也就是把所有的情况的列举出来了 
*/

#include <bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
#define hr cout<<"-------------------------------------\n"
#define br cout<<'\n';
const int N=5005; 

int n;
bool g[N][N];

int h[N<<1],ne[N*N],e[N*N],tot;
void add(int a,int b) {
	e[++tot]=b; ne[tot]=h[a]; h[a]=tot;
}

int dfn[N<<1],low[N<<1],cnt;
int color[N<<1],scnt;
stack<int>st;
bool vis[N<<1];

void tarjan(int now) {
	dfn[now]=low[now]=++cnt;
	st.push(now);
	vis[now]=1;
	for(int i=h[now];i;i=ne[i]) {
		int to=e[i];
		if(dfn[to]==0) {
			tarjan(to);
			low[now]=min(low[now],low[to]);
		} 
		else if(vis[to])low[now]=min(low[now],dfn[to]);
	}
	if(dfn[now]==low[now]) {
		scnt++;
		while(1) {
			int k=st.top();st.pop();vis[k]=0;
			color[k]=scnt;
			if(k==now)break;
		}
	}
}

//认识的,不认识的 
int c1[N],c2[N],cnt1=0,cnt2=0;
int match[N],f[N];
bool t[N];

void calc() {
	for(int i=1;i<=n;i++) {
		if(color[i]==color[i+n]) {
			cout<<"0\n";
			return ;
		}
		if(color[i]<color[i+n])c1[++cnt1]=i,t[i]=1;
		else c2[++cnt2]=i;
	}
	int ans=(cnt1&&cnt2);
	for(int i=1;i<=cnt1;i++)for(int j=1;j<=cnt2;j++)//判断对面的人我是否认识 
		if(g[c1[i]][c2[j]])f[c1[i]]++,match[c1[i]]=c2[j];
	for(int i=1;i<=cnt2;i++)for(int j=1;j<=cnt1;j++)//判断对面的人我是否为不认识 
		if(g[c2[i]][c1[j]]==0)f[c2[i]]++,match[c2[i]]=c1[j];
	for(int i=1;i<=n;i++)if(f[i]==1&&f[match[i]]==0)ans++;//对面这样的只有一个,并且可以过来 
	for(int i=1;i<=n;i++)if(f[i]==0)
		if((t[i]&&cnt1>1)||(t[i]==0&&cnt2>1))ans++;//直接取到对方的阵营就可以了 
	cout<<ans<<'\n';
}

void solve() {
	cin>>n;
	for(int i=1,cnt,x;i<=n;i++) {
		cin>>cnt;
		while(cnt--)cin>>x,g[i][x]=1;
	}
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
		if(i!=j) {
			if(g[i][j])add(i+n,j);
			else add(i,j+n);
		}
	for(int i=1;i<=2*n;i++)if(dfn[i]==0)tarjan(i);
	calc();
}

signed main() {
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	solve();
	return 0;
}



标签:cnt,认识,int,ans,阵营,计数问题,sat
From: https://www.cnblogs.com/basicecho/p/17535551.html

相关文章

  • D. Catowice City--(2-sat)
    D.CatowiceCity--(2-sat)2-sat简介也就是有0/1两种状态,最后必须要每个人有一种状态,并且选够n个。一般是设立两个点x,x+n然后判断是否有矛盾。不同这题建图后会发现x和x+n这两个图是没有交集的,所以只需要建立一个图。至于是人还是猫,只需要确定最后一个,就可以了,也就是color最......
  • 【论文阅读】CrossFormer: A Versatile Vision Transformer Based on Cross-scale Att
    来自CVPR2021论文地址:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2108.00154.pdf代码地址:https://link.zhihu.com/?target=https%3A//github.com/cheerss/CrossFormer一、Motivation 主要还是ViT的历史遗留问题ViT在处理输入时,将图片划分为了相等大小的图像......
  • 【论文阅读】Pyramid Vision Transformer: A Versatile Backbone for Dense Predictio
    来自ICCV2021论文地址:[2102.12122]PyramidVisionTransformer:AVersatileBackboneforDensePredictionwithoutConvolutions(arxiv.org)代码地址:https://link.zhihu.com/?target=https%3A//github.com/whai362/PVT一、Motivation1.将金字塔结构引入视觉Transformer,使......
  • eSATA接口保护,ESD静电保护器件如何选型?
    eSATA英文全称是:ExternalSerialATA,中文叫:外部串行ATA,是一种数据接口技术。eSATA并不是什么新技术,它是SATA接口的外部扩展规范。换言之,eSATA就是“外置”版的SATA,是用来连接外部而非内部SATA设备,比如拥有eSATA接口,就可以轻松地将SATA硬盘与机箱的eSATA接口连接,而不用打开机箱更换S......
  • hasattr和getattr判断并调用方法属性
    下面是一个使用hasattr和getattr判断并调用方法属性的示例代码,实现了一个简单的FTP服务器:classFtpServer:defserve_forever(self):#服务器逻辑filename="example.txt"ifhasattr(self,"get"):get_method=getattr(self,"g......
  • VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator-翻译
    摘要:本文介绍了一种单目视觉惯性系统(VINS),用于在各种环境中进行状态估计。单目相机和低成本惯性测量单元(IMU)构成了六自由度状态估计的最小传感器套件。我们的算法通过有界滑动窗口迭代地优化视觉和惯性测量,以实现精确的状态估计。视觉结构是通过滑动窗口中的关键帧来维护的,而惯性......
  • 混合性对话:Towards Conversational Recommendation over Multi-Type Dialogs
    混合型对话传统的人机对话研究专注于单一类型的对话,并且往往预设用户一开始就清楚对话目标。但实际应用中,人机对话常常混合了多种类型,例如闲聊、任务导向对话、推荐对话、问答等,并且用户目标是未知的。在这样的混合型对话中,机器人需要主动自然地进行对话推荐。“混合型对话”这......
  • FPGA sataII sataIII 固态存储 文件系统FPGA sata2 sata3 固态存储
    FPGAsataIIsataIII固态存储文件系统FPGAsata2sata3固态存储1.支持xilinx全系列FPGA器件2.提供文件系统3.提供硬件解决方案4.移植方便,相当于操作fifo接口就可以了,根据记录行程文件ID:5510000598067161402......
  • 从Satin到Lyra 为何微软、谷歌都盯向音频编解码器?
    回顾今年的2月份,可以说是音频编解码器最为热闹的一个月。先是微软宣布推出最新款由AI支持的音频编解码器——Satin。仅一周后,谷歌推出了用于语音压缩的新型超低比特率音频编解码器——Lyra,并且Android版本已开源。在此,也非常感谢来自国内音频领域的知名业内人士对本文发表评论及审......
  • 【论文阅读】Pyramid Vision Transformer:A Versatile Backbone for Dense Prediction
    ......