首页 > 其他分享 >D. Catowice City--(2-sat)

D. Catowice City--(2-sat)

时间:2023-07-06 17:22:15浏览次数:41  
标签:City vis -- Catowice scnt int low now

D. Catowice City--(2-sat)

2-sat简介

也就是有0/1两种状态,最后必须要每个人有一种状态,并且选够n个。
一般是设立两个点x,x+n然后判断是否有矛盾。

不同

这题建图后会发现x和x+n这两个图是没有交集的,所以只需要建立一个图。
至于是人还是猫,只需要确定最后一个,就可以了,也就是color最小的这个点,他一定是没有度数的,并且不会对其他人产生影响。

代码

/*
出了自己到自己不建立边之外
其他的都需要建立边 

1-n表示人 n+1-2n表示猫 

1
1 1
1 1

需要保证至少有一个人是0 

因为根据列出的关系
发现是x->y建边
x+n->y+n建边 ,两者其实是不会有交集的,只需要建立一次边就可以了
然后进行跑图,选择第一个连通分量为人,或者是什么,因为不会对后面产生影响 
*/

#include <bits/stdc++.h>
using namespace std;
#define int long long
using pii=pair<int,int>;
#define hr cout<<"-------------------------------------\n"
#define br cout<<'\n';
#define fi first
#define se second
const int M=1e6+5;

int n,m;

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

int dfn[M],low[M],cnt;
int color[M],siz[M],scnt;
stack<int>st;
int vis[M];
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;
			siz[scnt]++;
			if(k==now)break;
		}
	}
}

void print() {
	if(scnt==1) {
		cout<<"No\n";
		return ;
	}
	cout<<"Yes\n";
	cout<<siz[1]<<' '<<n-siz[1]<<'\n';
	for(int i=1;i<=n;i++)if(color[i]==1)cout<<i<<' ';cout<<'\n';
	for(int i=1;i<=n;i++)if(color[i]!=1)cout<<i<<' ';cout<<'\n'; 
	//必须要保证至少有一个人,或者一只猫才可以 
	
}

void init() {
	tot=scnt=cnt=0;
	for(int i=1;i<=n;i++) {
		dfn[i]=low[i]=h[i]=0;
		color[i]=vis[i]=siz[i]=0;
	}
}

int another(int x) {
	return x+n;
}

void solve() {
	cin>>n>>m;
	init(); 
	for(int i=1;i<=m;i++) {
		int x,y;
		cin>>x>>y;
		if(x==y)continue; 
		add(x,y);//两者都选人 
//		add(another(y),another(x));//或者两者都选猫 ,那么没必要加倍了 
	}
	for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);
	print();
}

signed main() {
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int TT;cin>>TT;while(TT--)
	solve();
	return 0;
}



标签:City,vis,--,Catowice,scnt,int,low,now
From: https://www.cnblogs.com/basicecho/p/17532779.html

相关文章

  • rpm安装卸载jdk
    安装rpm-ivhjdk-7-linux-x64.rpm卸载先查看安装的包rpm-qa|grepjdk卸载rpm-e--nodepsjdk-1.7.0-fcs.x86_64 ......
  • Subquery? No, it's join!
    作者:王旭东Databend研发工程师https://github.com/xudong963在SQL查询中,子查询是一种常用的技术,它允许我们在一个查询内部嵌套另一个查询,以实现更复杂的数据检索和分析。如何在数据库内核中高效的处理子查询是非常有挑战的,本文将介绍如何在Databend中构建state-of-art......
  • 【滨州学院】办公用纸报销-JS-金额计算
     JS:报销单:pcvarA4ShuLiang=mini.get('A4ShuLiang');varA4DanJia=mini.get('A4DanJia');varA3ShuLiang=mini.get('A3ShuLiang');varA3DanJia=mini.get('A3DanJia');A4ShuLiang.on('valuechanged',codeV......
  • requests 下载大文件
    #-*-coding:utf-8-*-fromcontextlibimportclosingfromrequestsimportgeturl='https://www.test.video/aa'#但是使用with语句的时候是需要条件的,任何对象,只要正确实现了上下文管理,就可以使用with语句,实现上下文管理是通过__enter__和__exit__这两个方法实现的wi......
  • 基于rancher搭建k8s
    快速搭建rancher-v用来挂载证书,如果没有证书,可以删除,默认使用rancher内置的自签证书dockerrun-d--namerancher--privileged--restart=unless-stopped\-p10080:80-p10443:443\-v/root/tmp/rancher.mb.com.crt:/etc/rancher/ssl/cert.pem\-v/root......
  • 【滨州学院】空闲资产申请计算差额JS
    PC//获取控件'KXSL'、'SQSL'的值varJinE01=mini.get('KXSL');varJinE02=mini.get('SQSL');//一旦值发生改变,触发codeValue函数JinE01.on('valuechanged',codeValue);JinE02.on('valuechanged',codeValue);funct......
  • 2023/7/07
    今天主要学习了Java的异常处理首先,一个程序如果碰到了异常不处理,程序就会立即停止,而异常处理就是在异常发生的情况下启动类似于备用方案使程序继续运行Java中的异常捕获结构由try,catch,finally三部分构成,其中,try和catch是必须同时存在的。try中的代码就是可能存在异常的代码,catc......
  • docker记录-compose拉起es
    elasticsearch:image:docker.elastic.co/elasticsearch/elasticsearch:7.4.2container_name:es_node_01privileged:truenetworks:-pangu_onlineports:-"9700:9200"environment:-cluster.name=docker_cluster-node.name=node_01-node.master=true......
  • 宝塔搭建出现连接不到服务器 搭建宝塔8.0 面板会出现 连接丢失需要重新连接
    搭建宝塔8.0  面板会出现连接丢失需要重新连接碰见这个问题因为宝塔的8.0 镜像换了需要重新执行一下宝塔镜像btpipinstallsimple-websocket==0.10.0&&bt1  执行完成之后出现这个就可以使用面板 ......
  • 【滨州学院】空闲资产申请-JS
    PC://获取控件'SL'的值varJinE01=mini.get('SL');//一旦值发生改变,触发codeValue函数JinE01.on('valuechanged',codeValue);functioncodeValue(){varH1Value=JinE01.getValue()==''?0:JinE01.getValue();//若控件值为空赋值为0,否则取对应的值......