HDU 1824 Let's go home (2-SAT)

题目地址:HDU 1824

这题可以把每队的两个队员看成一个,这样就是2-sat水题了。。。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
int head[2100], cnt, index, top, ans;
int dfn[2100], low[2100], instack[2100], stak[2100], belong[2100];
int id[2100];
struct node
{
    int u, v, next;
}edge[1000000];
void add(int u, int v)
{
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void tarjan(int u)
{
    dfn[u]=low[u]=++index;
    stak[++top]=u;
    instack[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        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(dfn[u]==low[u])
    {
        ans++;
        while(1)
        {
            int v=stak[top--];
            instack[v]=0;
            belong[v]=ans;
            if(u==v) break;
        }
    }
}
void init()
{
    memset(head,-1,sizeof(head));
    cnt=index=top=ans=0;
    memset(instack,0,sizeof(instack));
    memset(dfn,0,sizeof(dfn));
}
int main()
{
    int n, m, i, j, a, b, c, flag;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            id[a]=i<<1;
            id[b]=id[c]=i<<1|1;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            add(id[a],id[b]^1);
            add(id[b],id[a]^1);
        }
        for(i=0;i<2*n;i++)
        {
            if(!dfn[i])
                tarjan(i);
        }
        flag=0;
        for(i=0;i<n;i++)
        {
            if(belong[i<<1]==belong[i<<1|1])
            {
                flag=1;
                break;
            }
        }
        if(flag)
            puts("no");
        else
            puts("yes");
    }
    return 0;
}

HDU 1824 Let's go home (2-SAT)

时间: 2024-11-03 03:27:31

HDU 1824 Let's go home (2-SAT)的相关文章

HDU 3062 &amp;&amp; HDU 1824 &amp;&amp; POJ 3578 &amp;&amp; BZOJ 1997 2-SAT

一条边<u,v>表示u选那么v一定被选. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 const int Maxm=21000; 7 const int Maxn=2010; 8 struct EDGE{int to,next;}edge[Maxm]; 9 int T,m

HDU 1824

好吧,这次估计是明白边的含义了. X\/Y= -X->Y = -Y->X  这就达成了选了-X必须选Y的目的了.对于这道题,必须要明白题目了. 每一个队(三人一队)或者队长留下或者其余两名队员同时留下 : 就可以得到  X\/(Y^Z)=1 而不是互斥的. 以及  X->-Y     -X->Y 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include &l

HDU 1824 Let&#39;s go home

Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1435    Accepted Submission(s): 573 Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                        —— 余光中 集训是辛苦的,道路是坎坷的,休息还是

HDU 1824 Let&amp;#39;s go home (2-SAT判定)

Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1616    Accepted Submission(s): 661 Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头. -- 余光中 集训是辛苦的.道路是坎坷的,歇息还是必须的.经过一段时间的训练,lcy决定让大家

HDU 1824 Let&#39;s go home (2-SAT判定)

Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1616    Accepted Submission(s): 661 Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头. -- 余光中 集训是辛苦的,道路是坎坷的,休息还是必须的.经过一段时间的训练,lcy决定让大家

(2 sat) hdu 1824

Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1523    Accepted Submission(s): 616 Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                        —— 余光中 集训是辛苦的,道路是坎坷的,休息还是

【小结】2-sat

2?sat 小结 2?sat解决的是可满足性问题,并且每个合取范式中的文字个数不多于2个. 形式为: (a∨?b)∧(?c∨?d)∧(?a∨d)? 将所有a∨b改成(?a?b)∧(?b?a) 建边,每个变量a对应两个点a和a+n 如果存在cmp[a]==cmp[a+n]不成立,否则成立.且如果cmp[a]>cmp[a+n],令a=true,否则令a=false即为原式的一组解. #include <cstdio> #include <iostream> #include &l

2-SAT问题

2-SAT问题 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0.A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系.这个称为SAT问题,特别的,若每种限制关系中最多只对两个元素进行限制,则称为2-SAT问题. 由于在2-SAT问题中,最多只对两个元素进行限制,所以可能的限制关系共有11种: A[x] NOT A[x] A[x] AND A[y] A[x] AND NOT A[y] A[x] OR A[y] A

【图论】2-sat总结

2-sat总结 2-sat问题,一般表现的形式为.每一个点有两种方式a,b,要么选a,要么选b.而且点点之间有一些约束关系.比如:u和v至少一个选a.那么这就是一个表达式.把a当成真,b当成假,那就是u真或v真.2-sat的题目就是这样.给定这些约束,推断是否会矛盾 注意表达式的转化形式,(事实上就是离散数学中那几种转换方式) 比方(u真且v真)或(u假且v假)就能够转化成(u真或v假)且(u假或v真),这样就能建立关系 2-sat中的原理,事实上和2染色是一样的,把每一个结点拆分成一个真结点和