首页 > 其他分享 >2-SAT

2-SAT

时间:2024-05-19 11:42:04浏览次数:10  
标签:cnt int dfn low instk SAT

2-SAT

2-SAT,简单的说就是给出 \(n\) 个集合,每个集合有两个元素,已知若干个 \(<a,b>\),表示 \(a\) 与 \(b\) 矛盾(其中 \(a\) 与 \(b\) 属于不同的集合)。然后从每个集合选择一个元素,判断能否一共选 \(n\) 个两两不矛盾的元素。显然可能有多种选择方案,一般题中只需要求出一种即可。

对于条件 \(a \lor b\) 可以转换成 \((\lnot a \rightarrow b) \land (\lnot b \rightarrow a)\)。

那么我们可以根据这个式子连边,那么同一强连通分量的值一定是相等的。

所以如果 \(x\) 与 \(\lnot x\) 在同一个强连通分量中时,一定无解。

强连通分量的编号就是反图的拓扑序
编号为1的强联通分量没有出度

模板

stack<int> stk;
vector<int> e[N];
int dfn[N],low[N],tot;
int instk[N],scc[N],siz[N],cnt;

void tarjan(int u){
    dfn[u]=low[u]=++tot;
    stk.push(u);instk[u]=1;
    for(auto v:e[u]){
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }else if(instk[v]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        int v;++cnt;
        do{
            v=stk.top();
            stk.pop();
            instk[v]=0;
            scc[v]=cnt;
            ++siz[cnt];
        }while(v!=u);
    }
}
void Showball(){
    int n,m;
    cin>>n>>m;
    while(m--){
        int i,a,j,b;
        cin>>i>>a>>j>>b;
        i--;j--;
        e[(i<<1)+!a].pb((j<<1)+b);
        e[(j<<1)+!b].pb((i<<1)+a);
    }
    for(int i=0;i<2*n;i++){
        if(!dfn[i]) tarjan(i);
    }
    vector<int> ans(n);
    for(int i=0;i<n;i++){
        if(scc[i<<1]==scc[i<<1|1]) return cout<<"IMPOSSIBLE\n",void();
        ans[i]=scc[i<<1|1]<scc[i<<1];
    }
    cout<<"POSSIBLE\n";
    for(int i=0;i<n;i++) cout<<ans[i]<<" ";
} 

标签:cnt,int,dfn,low,instk,SAT
From: https://www.cnblogs.com/showball/p/18200171

相关文章

  • P4171 [JSOI2010] 满汉全席 2-SAT
    P4171[JSOI2010]满汉全席2-SAT题目链接思路:2-SAT模板题,我们将满席定为1,汉席定为0.那么建边即可。判断同一道菜满汉是否在强联通分量中即可。注意多测清空!!!代码:vector<int>e[N];stack<int>stk;intdfn[N],low[N],tot;intinstk[N],scc[N],siz[N],cnt;intn,m;void......
  • P4782 【模板】2-SAT
    简记:1.参考学习:https://blog.csdn.net/qaqwqaqwq/article/details/126124806https://www.cnblogs.com/cjjsb/p/9771868.html2.代码:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<s......
  • E. Lomsat gelral
    https://codeforces.com/contest/600/problem/E题意:给一颗树,如果当前叶子为根的树中数字出现最多次数为k,求该树中所有出现次数为k的数字之和。思路:dfs+线段树合并。总结:第一次接触线段树合并,整理了3个上午才整理出模板来,不知道这种线段树合并有没有区间更新的功能,这个题目是......
  • 2021看雪SDC议题回顾 | SaTC:一种全新的物联网设备漏洞自动化挖掘方法
    https://zhuanlan.zhihu.com/p/431335767随着物联网技术的日新月异,未来物联网的应用将越来越广泛,但它同样也会带来大量安全漏洞。而当下IoT漏洞挖掘技术尚未完全成熟,许多人的信息安全意识不够强,技术革新面临着巨大的安全隐患。来自上海交通大学的陈力波老师所提出的SaTC:一种全新......
  • 《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记
    论文标题《DecoupledOptimisationforLong-TailedVisualRecognition》长尾视觉识别的解耦优化作者CongCong、ShiyuXuan、SidongLiu、ShiliangZhang、MauricePagnucco和YangSong、来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处理国家......
  • setsate更新之后和usestate的区别
    1setsatesetState(updater[,callback])updater:object/function-用于更新数据callback:function-用于获取更新后最新的state值a构造函数是唯一建议给this.state赋值的地方b不建议直接修改state的值,因为这样不会重新渲染组件c自动进行浅合并(只会合并第1层)d......
  • 原始翎风CLIENT8位 (11) fsata的学习
    本单元提供系统中的所有对话框显示MAINIMAGEFILE='Data\Prguse.wil';MAINIMAGEFILE2='Data\Prguse2.wil';MAINIMAGEFILE3='Data\Prguse3.wil';CHRSELIMAGEFILE='Data\ChrSel.wil';MINMAPIMAGEFILE='Data\mmap.wil......
  • ICESat-2 从ATL08中获取ATL03分类结果
    ICESat-2ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处理得到一系列的结果,详情见数据字典:ATL08ProductDataDictionary(nsidc.org)ATL08使用DRAGANN算法对ATL03数据做了去噪处理,并使用分类算法对每个光子进行分类标志值标志......
  • ICESat-2 ATL03光子数据读取
    ICESat-2数据处理的方式一般为将光子数据投影到沿轨距离和高程的二维空间。如下图:ATL03数据读取H5是一种数据存储结构,读取原理就是按照该结构获取数据,这里给出两种读取方式。ATL03的数据字典:ATL03ProductDataDictionary(nsidc.org)使用pandasimportwarningsimportpan......
  • com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed at S
     适用的druid数据库连接池一直有问题,无法连接,但是什么都没改过。排查了数据库(数据库单独连接没问题)、防火墙、IP白名单等步骤后,重启服务器、重启应用后都无法解决。重启应用过程中发现了应用无法正常启动的情况,这点让人觉得很意外,于是想看下现在服务器上运行的jar包情况,命令是......