[HDU3062]Party

传送门

2-sat问题,只需要判断yes或no

所以可以直接连边,缩点,判断同一组的是否在同一个块中。

 1 #include <cstdio>
 2 #include <stack>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 #define N 1000001
 7
 8 int n, m, cnt, idx, sz;
 9 int head[N], to[N << 1], next[N << 1], dfn[N], low[N], belong[N];
10 bool ins[N], flag;
11 std::stack <int> s;
12
13 inline void add(int x, int y)
14 {
15     to[cnt] = y;
16     next[cnt] = head[x];
17     head[x] = cnt++;
18 }
19
20 inline void tarjan(int u)
21 {
22     int i, v;
23     dfn[u] = low[u] = ++idx;
24     ins[u] = 1;
25     s.push(u);
26     for(i = head[u]; i != -1; i = next[i])
27     {
28         v = to[i];
29         if(!dfn[v])
30         {
31             tarjan(v);
32             low[u] = std::min(low[u], low[v]);
33         }
34         else if(ins[v]) low[u] = std::min(low[u], dfn[v]);
35     }
36     if(low[u] == dfn[u])
37     {
38         ++sz;
39         do
40         {
41             v = s.top();
42             s.pop();
43             ins[v] = 0;
44             belong[v] = sz;
45         }while(u != v);
46     }
47 }
48
49 int main()
50 {
51     int i, j, a, b, c, d;
52     while(~scanf("%d", &n))
53     {
54         memset(head, -1, sizeof(head));
55         memset(ins, 0, sizeof(ins));
56         memset(dfn, 0, sizeof(dfn));
57         idx = cnt = sz = 0;
58         while(!s.empty()) s.pop();
59         scanf("%d", &m);
60         for(i = 1; i <= m; i++)
61         {
62             scanf("%d %d %d %d", &a, &b, &c, &d);
63             a = (a << 1) + c;
64             b = (b << 1) + d;
65             add(a, b ^ 1);
66             add(b, a ^ 1);
67         }
68         for(i = 0; i < n << 1; i++)
69          if(!dfn[i])
70           tarjan(i);
71         flag = 0;
72         for(i = 0; i < n; i++)
73          if(belong[i << 1] == belong[(i << 1) ^ 1])
74           flag = 1;
75         if(flag) printf("NO\n");
76         else printf("YES\n");
77     }
78     return 0;
79 }

时间: 2024-11-03 22:38:42

[HDU3062]Party的相关文章

hdu3062 2-SAT模板

题意:中文题不用解释 思路:这题讲的就是2-sat,如果想知道什么事2-sat可以看看大牛的http://blog.csdn.net/pi9nc/article/details/11849843,每个结点有两种状态,u结点的一个状态与v结点的一个状态矛盾,那么就还有另外两个状态时不矛盾的,那么我们把它连边.最后强连通,如果一个结点的两个状态在一个连通图中,那么就矛盾了. #include<stdio.h> #include<string.h> const int maxn = 30

two-sat hdu3062 UVALive 3211

2-sat就是给定形如 x=xval or y=yval的若干约数,求是否存在全部满足. 这是一种dfs的算法,参考大白书 hdu3062 基本上是模板题吧,xval和yval都告诉你了. #include<bits/stdc++.h> using namespace std; const int N=(int)2e3+10; int n,m; int mark[N],s[N],top=0; vector<int> g[N]; bool dfs(int x) { if(mark[x

HDU3062(2-SAT)

Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6682    Accepted Submission(s): 2194 Problem Description 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同

hdu3062(two-sat)

传送门:Party 题意:有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可能会有n 个人同时列席? 分析:two-sat裸题,对于有仇恨的两对夫妻u,v,连边u->v'和v->u':建好图直接tarjan缩点判断每对夫妻[i,i']是否属于一个强连通块内即可. #include <cstdio> #include <cstring&g

hdu3062 2-sat

比较水的题~ 无聊玩玩练练手速~ #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<algorithm> using namespace std; const int MAXN=1005*2,MAXE=2005*2005; vector<vector<int> >v(MAXN); int ins[MAXN];int d

二分+2-sat——hdu3062

hdu3622升级版 注意要保留两位小数 /* 给定n对圆心(x,y),要求从每对里找到一个点画圆,不可相交 使得最小半径最大 二分答案,设最小半径为r 然后两两配对一次进行判断,在2-sat上连边即可 */ #include<bits/stdc++.h> using namespace std; #define esp 1e-6 #define N 405 #define M 405*405 struct Node{double x,y;}p[N][2]; struct Edge{int t

【小结】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

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

Party

hdu3062:http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意:中文题. 题解:很明显的2-sat.然后要深刻理解命题和逆否命题.如这一题,c1,c2,表示矛盾.则可以推出如果选c1,则要选~c2,逆否就是不选~c2就要选~c1,就是选c2和~c1,所以既可以加边了,然后就是2-sat. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc