hdu 3062 基础的2sat
生活随笔
收集整理的這篇文章主要介紹了
hdu 3062 基础的2sat
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
Party
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4035 Accepted Submission(s): 1300
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
思路:
? ? ?基礎的2sat,不會的建議看根據對稱性解析2sat的那個, 把夫妻看成基礎對,排斥的兩個人看成排斥對,直接建邊就行了,縮點我用的是雙深搜的強連通。
#include<stdio.h> #include<string.h> #include<stack>#define N_node 2000 + 10 #define N_edge 2000000 + 100 using namespace std;typedef struct {int to ,next; }STAR;STAR E1[N_edge] ,E2[N_edge]; int list1[N_node] ,list2[N_node] ,tot; int mark[N_node] ,Belong[N_node] ,cnt; stack<int>st;void add(int a ,int b) {E1[++tot].to = b;E1[tot].next = list1[a];list1[a] = tot;E2[tot].to = a;E2[tot].next = list2[b];list2[b] = tot; }void DFS1(int s) {mark[s] = 1;for(int k = list1[s] ;k ;k = E1[k].next){int xin = E1[k].to;if(!mark[xin]){mark[xin] = 1;DFS1(xin);}}st.push(s); }void DFS2(int s) {mark[s] = 1;Belong[s] = cnt;for(int k = list2[s] ;k ;k = E2[k].next){int xin = E2[k].to;if(!mark[xin]){mark[xin] = 1;DFS2(xin);}} }int main () {int n ,m ,i ,a ,b ,c ,d;while(~scanf("%d %d" ,&n ,&m)){memset(list1 ,0 ,sizeof(list1));memset(list2 ,0 ,sizeof(list2));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);a = a * 2 + c,b = b * 2 + d;add(a ,b^1) ,add(b ,a^1);}while(!st.empty()) st.pop();memset(mark ,0 ,sizeof(mark));for(i = 1 ;i <= n * 2 - 1 ;i ++)if(!mark[i])DFS1(i);memset(mark ,0 ,sizeof(mark));cnt = 0;while(!st.empty()){int xin = st.top();st.pop();if(!mark[xin]){++cnt;DFS2(xin);}} int mk = 0;for(i = 0 ;i < n ;i += 2){if(Belong[i] == Belong[i^1])mk = 1;}if(mk)puts("NO");else puts("YES");}return 0; }
總結
以上是生活随笔為你收集整理的hdu 3062 基础的2sat的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4810 Cn中取i异或和
- 下一篇: hdu1824 基础2sat