2-SAT(HDU-3062 party)

解决问题类型:

书本定义:给一个布尔方程,判断是否存在一组解使整个方程为真,被称为布尔方程可满足性问题(SAT)

因为本题只有0,1(丈夫 妻子只能去一个人),所以是2-SAT。

算法思想:

根据题意:对于(a ,a' )(b ,b' ),如果a ,b 构成仇恨问题,那么a 若出席,b' 一定出席,b若出席,a ‘ 一定出席;据此他们之间可以建有向边(有向边的意义一定要明白! ! !代码中建边时已经标注)。而强连通分量的特点就是可以缩点,判断两点之间是否可以相互到到达(对此图tarjan缩点,若一对夫妻在一个强连通分量中,表示这对夫妻之间有一条逻辑上的有向边)

可能脑子太迟钝了,好不容易悟出来,不过还是很开心

可能因为学了数据结构,觉得邻接表就是单链表的头插法,有木有!!!

撸代码:

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
struct node
{
    int v,nex;
} edge[1000007];
int dfn[2007],low[2007],instack[2007],head[2007],index;
int cir,belong[2007],cnt;
stack<int>s;
void init()
{
    for(int i=0; i<=2005; i++)
    {
        head[i]=-1;
        dfn[i]=0;
        low[i]=0;
        instack[i]=0;
        belong[i]=0;
    }
    while(!s.empty())
        s.pop();
    cir=0;
    index=0;
    cnt=0;
}
void add_edge(int u,int v)
{
    edge[cnt].v=v;
    edge[cnt].nex=head[u];
    head[u]=cnt++;
}/*邻接表相当于链表的头插法*/
void Tarjan(int u)
{
    instack[u]=1;
    s.push(u);
    dfn[u]=low[u]=++index;
    for(int i=head[u]; i!=-1; i=edge[i].nex)
    {
        int v=edge[i].v;
        if(!dfn[v])
        {
            Tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(instack[v])
        {
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(low[u]==dfn[u])
    {
        ++cir;
        int node;
        do
        {
            node=s.top();
            s.pop();
            instack[node]=0;
            belong[node]=cir;
        }
        while(node!=u);
    }
    return ;
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        int a,b,c,d;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&d);
            a=(a<<1)+c;
            b=(b<<1)+d;/*a b 不能在一块*/
            add_edge(a,b^1);
            add_edge(b,a^1);
            /*!!! 为什么没有a^1和b^1:有向边意义:若选a必选b^1,b同理*/
        }
        for(int i=0; i<n*2; i++)
            if(!dfn[i])
                Tarjan(i);
        int flag=0;
        for(int i=0; i<n; i++)
        {
            if(belong[i<<1]==belong[(i<<1)^1])/*!!!若某0 1点在一个连通分量,说明两个都要选,自相矛盾*/
                flag=1;
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

DREAM_yao:若有错误,热烈欢迎指正

2-SAT(HDU-3062 party)的更多相关文章

  1. HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT

    一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...

  2. hdu 3062 Party 2-SAT

    题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...

  3. hdu 3062 2-sat入门题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 #include <cstdio> #include <cmath> # ...

  4. hdu 3062+1824(2-sat入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 思路:根据矛盾关系连边(如果a与b矛盾,则连边a'->b,b'->a),然后强连通缩 ...

  5. HDU 3062:Party(2-SAT入门)

    http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意:中文. 思路:裸的2-SAT.判断二元组的两个人是否在同一个强连通分量. 学习地址:http://w ...

  6. HDU 3062 Party

    Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. hdu 3062 2-SAT问题

    思路:裸的2-SAT. #include<map> #include<set> #include<cmath> #include<queue> #inc ...

  8. hdu 3062

    2-SAT的入门题: 网上说这个算法最好的入门教材是:伍昱的<由对称性解2-SAT问题>的ppt和赵爽的论文<2-SAT 解法浅析>: 看了一下伍昱的ppt,很好理解! 而这道 ...

  9. 图论(2-sat):HDU 3062 Party

    Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  10. hdu 3062 2-Sat入门

    开始学习2-Sat,前面看了对称性解决2-sat的ppt,很有帮助. 题意:n对夫妻,夫妻需要出席一人,给出不相容的关系,求每对是否能完成出席方案. 思路:通过关系建图,Tarjan缩点,然后进行判断 ...

随机推荐

  1. Git私服搭建

    Git私服搭建 一.Git服务器搭建方式 GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信? Git支持的四种通信协议: Local(本地协议) ...

  2. 浅谈.NET Framework 与CLR

            承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码.             通常,.NET Framework 应用程序在生成它的 CLR ...

  3. 压力测试(二)-Jmeter基本介绍

    1.Jmeter基本介绍和使用场景 简介 1.压测不同的协议和应用 1) Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …) 2) SOAP / RES ...

  4. .NET Core C#目录

    .NET Core技术开发指南 简介 本系列教程是一份关于微软.NET Core技术栈的全面的教程,其中涉及了C#.Typescript.Angular.Redis等一系列的教程.其中教程中通常会含有 ...

  5. a++与++a的陷阱与盲区

    故事发生在2019.7.15的3.pm,正在复习数据结构题目,写了一句如下指令(以下函数运行在win10的dev编译器下面) #include<bits/stdc++.h> using n ...

  6. 第一个Hystrix程序 Hystrix 一

    1.导入jar包 <dependencies> <dependency> <groupId>com.netflix.hystrix</groupId> ...

  7. 用反射机制和pandas,实现excel数据的读取以及参数化${arg}的赋值

    反射类:class GetData: index = pd.read_excel(file_name, sheet_name).loc[0, ['index']].values[0] email = ...

  8. Vue Snackbar 消息条队列显示,依次动画消失的实现

    效果预览 思路 封装 Snackbar 组件: 在根路由页面下建立全局 Snackbar 控制器,统一管理 Snackbar: 通过事件通知全局 Snackbar 控制器显示消息: 实现 1. 封装 ...

  9. 深度学习与人类语言处理-语音识别(part1)

    语音识别 语音识别该何去何从? 1969年,J.R. PIERCE:"语音识别就像把水变成汽油.从大海中淘金.治疗癌症.人类登陆月球" 当然,这是50年前的想法,那么语音识别该如何 ...

  10. <字符串匹配>KMP算法为何比暴力求解的时间复杂度更低?

    str表示文本串,m表示模式串; str[i+j] 和 m[j] 是正在进行匹配的字符; KMP的时间复杂度是O(m+n)  ,  暴力求解的时间复杂度是O(m*n) KMP利用了B[0:j]和A[i ...