首页 > 其他分享 >hdu:Party(2-SAT)

hdu:Party(2-SAT)

时间:2023-05-15 20:26:18浏览次数:38  
标签:hdu ch int a1 vis a2 Party c1 SAT

Problem Description
有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n 个人同时列席?

Input
n: 表示有n对夫妻被邀请 (n<= 1000)
m: 表示有m 对矛盾关系 ( m < (n - 1) * (n -1))

在接下来的m行中,每行会有4个数字,分别是 A1,A2,C1,C2
A1,A2分别表示是夫妻的编号
C1,C2 表示是妻子还是丈夫 ,0表示妻子 ,1是丈夫
夫妻编号从 0 到 n -1

Output
如果存在一种情况 则输出YES
否则输出 NO

Sample input
2
1
0 1 1 1
Sample output
YES

图论-2-SAT

每对夫妻只能夫去妻不去或反之两种情况设为i和i'
注意四点:一是kosaraju的dfs序是出栈序列
二是使用乘积表示可能出现一个点表示两重含义,采取加法偏移更容易处理
三是注意vis数组的标记的对象
四是要求到场n个人,夫妻两个不能一个都不到场

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
const int M=4e6+10;
int e[M],ne[M],h[N],idx;
int ce[M],cne[M],ch[N],cidx;
int vis[N],f[N],q[N],cnt;
void add(int u,int v)
{
    e[++idx]=v;
    ne[idx]=h[u];
    h[u]=idx;
}
void cadd(int u,int v)
{
    ce[++cidx]=v;
    cne[cidx]=ch[u];
    ch[u]=cidx;
}
void dfs1(int x)
{
    vis[x]=1;
    for(int i=h[x];~i;i=ne[i])
    {
        int j=e[i];
        if(!vis[j]) dfs1(j);
    }
    q[++cnt]=x;
}
void dfs2(int x,int y)
{
    vis[x]=0;f[x]=y;
    for(int i=ch[x];~i;i=cne[i])
    {
        int j=ce[i];
        if(vis[j]) dfs2(j,y);
    }
}
void solve(int n,int m)
{
    //因为第i对夫妻只有夫去或妻去两种情况,用i来表示夫去,i+T表示妻去
    memset(h,-1,sizeof h);
    memset(ch,-1,sizeof ch);
    idx=0;cidx=0;cnt=0;
    int T=n;
    for(int i=0;i<m;++i)
    {
        int a1,a2,c1,c2;
        cin>>a1>>a2>>c1>>c2;
        a1++;a2++;
        //用a1+c1*T若为夫则值为a1,若为妻则值为a1+T
        //用(a1+c1*T+T)%2*T表示否定,若为夫值为a1+T,若为妻值为a1
        add(a1+c1*T,(a2+c2*T+T)%(2*T));
        add(a2+c2*T,(a1+c1*T+T)%(2*T));
        cadd((a2+c2*T+T)%(2*T),a1+c1*T);
        cadd((a1+c1*T+T)%(2*T),a2+c2*T);
    }
    for(int i=1;i<=2*n;++i) if(!vis[i]) dfs1(i);
    for(int i=2*n;i;--i) if(vis[q[i]]) dfs2(q[i],q[i]);
    bool flag=1;
    for(int i=1;i<=n;++i) if(f[i]==f[i+T]) flag=0;
    if(flag) cout<<"YES"<<'\n';
    else cout<<"NO"<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    while(cin>>n>>m)
    {
        solve(n,m);
    }
}

标签:hdu,ch,int,a1,vis,a2,Party,c1,SAT
From: https://www.cnblogs.com/ruoye123456/p/17402960.html

相关文章

  • hdu:Let's go home(2-SAT)
    ProblemDescription小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。——余光中集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每......
  • hdu:How far away ?(树链剖分)
    ProblemDescriptionTherearenhousesinthevillageandsomebidirectionalroadsconnectingthem.Everydaypeolealwaysliketoasklikethis“HowfarisitifIwanttogofromhouseAtohouseB”?Usuallyithardtoanswer.Butluckilyintthisvilla......
  • hdu:Arbitrage(最短路变形)
    ProblemDescriptionArbitrageistheuseofdiscrepanciesincurrencyexchangeratestotransformoneunitofacurrencyintomorethanoneunitofthesamecurrency.Forexample,supposethat1USDollarbuys0.5Britishpound,1Britishpoundbuys10.0......
  • hdu:六度分离(最短路)
    ProblemDescription1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(smallworldphenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(sixdegreesofsepa......
  • Sata/世达大厂正弦波电动自行车控制器量产资料,包括源码和原理图pcb
    Sata/世达大厂正弦波电动自行车控制器量产资料,包括源码和原理图pcb源头代码,提供一定和相关配套ID:1780684041831000......
  • Your password does not satisfy the current policy requirements解决办法
    mysql5.7.x安装以后,想修改随机生成的密码为简单容易记忆的密码,如root,123456等,这时候通过修改密码的几种方式都不行,出现密码不符合当前安全策略要求。为了解决这种问题,可以修改几个值,他们是关于密码验证的设置。我们通过随机生成的密码,登录数据库,查看密码验证相关变量:mysql>show......
  • hdu:求和(逆元)
    ProblemDescriptionApex实验室里培养了很多种类的细菌。细菌的繁殖遵循如下规则:第k种细菌在第t个单位时间内新增的数量为k^t。例如,k=2,t=4时,第种细菌的总数为2+4+8+16。现在,实验室里一共有n种细菌,分别为1,2,3,…,n。在第1单位时间结束后,第k种细菌的个数为k个。求第m个单位时......
  • hdu:XOR(线性基)
    XOR数学-线性基设原集为S,线性基为P,若|S|>|P|,则异或会出现0。若|P|==n,则会产生2^n个不同数(包括0)而线性基不包含0元素,故若|S|中元素可以异或出0,k需要自减点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e4+10;lla[N......
  • 关于UnsatisfiedDependencyException问题的解决
    问题描述看到p命名空间使用同样的代码就可以运行,就直接将p改成了c,然后就一直报出这个错误问题解决查看我的相关配置文件,发现都没有问题,然后尝试将user对象的所有参数都给赋值,然后再试一试,然后正确结果就出来了;原来使用c命名空间的话,需要将该对象的所有属性都给赋值,但是p命名空......
  • ts的4.9属性之satisfies
    interfacePalette{red:number[];green:string;blue:number[];black?:boolean;}typeColors='red'|'green'|'blue';typeRGB=[number,number,number];constpalette={red:[255,0,0],g......