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 <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7
 8 const int MAXN=10010;
 9 const int MAXM=100100;
10
11 int head[MAXN],dfn[MAXN],low[MAXN],st[MAXN],stop,belong[MAXN],tot,index,pat;
12 bool stack[MAXN];
13 struct {
14     int u,v;
15     int next;
16 }edge[MAXM];
17 int n,m;
18
19 void init(){
20     stop=0; tot=0; index=0; pat=-1;
21     for(int i=0;i<6*n;i++){
22         head[i]=-1;
23         dfn[i]=low[i]=0;
24         belong[i]=-1;
25         stack[i]=false;
26     }
27 }
28
29 void addedge(int u,int v){
30     edge[tot].u=u;
31     edge[tot].v=v;
32     edge[tot].next=head[u];
33     head[u]=tot++;
34 }
35
36 void tarjan(int u){
37     int v;
38     dfn[u]=low[u]=++index;
39     st[stop++]=u; stack[u]=true;
40     for(int e=head[u];e!=-1;e=edge[e].next){
41         v=edge[e].v;
42         if(dfn[v]==0){
43             tarjan(v);
44             low[u]=min(low[u],low[v]);
45         }
46         else if(stack[v]){
47             low[u]=min(low[u],dfn[v]);
48         }
49     }
50     if(dfn[u]==low[u]){
51         pat++;
52         do{
53             v=st[--stop];
54             stack[v]=false;
55             belong[v]=pat;
56         }while(u!=v);
57     }
58 }
59
60 int main(){
61     int u,v;
62     int a,b,c;
63     while(scanf("%d%d",&n,&m)!=EOF){
64         init();
65         for(int i=1;i<=n;i++){
66             scanf("%d%d%d",&a,&b,&c);
67             addedge(a*2+1,b*2);
68             addedge(a*2+1,c*2);
69             addedge(c*2+1,a*2);
70             addedge(b*2+1,a*2);
71         }
72         for(int i=1;i<=m;i++){
73             scanf("%d%d",&u,&v);
74             addedge(u*2,v*2+1);
75             addedge(v*2,u*2+1);
76         }
77         for(int i=0;i<6*n;i++){
78             if(dfn[i]==0)
79             tarjan(i);
80         }
81         bool flag=true;
82         for(int i=0;i<3*n;i++){
83             if(belong[i*2]==belong[i*2+1]){
84                 printf("no\n");
85                 flag=false;
86                 break;
87             }
88         }
89         if(flag)
90         printf("yes\n");
91     }
92 }

HDU 1824

时间: 2024-10-20 21:01:07

HDU 1824的相关文章

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 Let&#39;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> #incl

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

【小结】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问题,一般表现的形式为,每个点有两种方式a,b,要么选a,要么选b,并且点点之间有一些约束关系,例如:u和v至少一个选a,那么这就是一个表达式,把a当成真,b当成假,那就是u真或v真,2-sat的题目就是这样,给定这些约束,判断是否会矛盾 注意表达式的转化形式,(其实就是离散数学中那几种转换方式) 比如(u真且v真)或(u假且v假)就可以转化成(u真或v假)且(u假或v真),这样就能建立关系 2-sat中的原理,其实和2染色是一样的,把每个结点拆分成一个真结点和一个假结