POJ 3905

加深了对有向边意义的理解了。2-SAT

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 using namespace std;
  7
  8 const int MAXN=2010;
  9 const int MAXM=2100100;
 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 int s1,s2;
 19
 20 void init(){
 21     stop=0; tot=0; index=0; pat=-1;
 22     for(int i=0;i<2*n;i++){
 23         head[i]=-1;
 24         dfn[i]=low[i]=0;
 25         belong[i]=-1;
 26         stack[i]=false;
 27     }
 28 }
 29
 30 void addedge(int u,int v){
 31     edge[tot].u=u;
 32     edge[tot].v=v;
 33     edge[tot].next=head[u];
 34     head[u]=tot++;
 35 }
 36
 37 void tarjan(int u){
 38     int v;
 39     dfn[u]=low[u]=++index;
 40     st[stop++]=u; stack[u]=true;
 41     for(int e=head[u];e!=-1;e=edge[e].next){
 42         v=edge[e].v;
 43         if(dfn[v]==0){
 44             tarjan(v);
 45             low[u]=min(low[u],low[v]);
 46         }
 47         else if(stack[v]){
 48             low[u]=min(low[u],dfn[v]);
 49         }
 50     }
 51     if(dfn[u]==low[u]){
 52         pat++;
 53         do{
 54             v=st[--stop];
 55             stack[v]=false;
 56             belong[v]=pat;
 57         }while(u!=v);
 58     }
 59 }
 60
 61 int main(){
 62     int u,v;
 63     while(scanf("%d%d",&n,&m)!=EOF){
 64         init();
 65         for(int i=1;i<=m;i++){
 66             scanf("%d%d",&s1,&s2);
 67             u=abs(s1)-1;
 68             v=abs(s2)-1;
 69         //    cout<<u<<‘ ‘<<v<<endl;
 70             if(s1>0&&s2>0){
 71                 addedge(2*u,2*v+1);
 72                 addedge(2*v,2*u+1);
 73             }
 74             else if(s1>0&&s2<0){
 75                 addedge(2*u,2*v);
 76                 addedge(2*v+1,2*u+1);
 77             }
 78             else if(s1<0&&s2>0){
 79                 addedge(2*u+1,2*v+1);
 80                 addedge(2*v,2*u);
 81             }
 82             else{
 83                 addedge(2*u+1,2*v);
 84                 addedge(2*v+1,2*u);
 85             }
 86         }
 87         for(int i=0;i<2*n;i++){
 88             if(dfn[i]==0)
 89             tarjan(i);
 90         }
 91         bool flag=true;
 92         for(int i=0;i<n;i++){
 93             if(belong[i*2]==belong[i*2+1]){
 94                 printf("0\n");
 95                 flag=false;
 96                 break;
 97             }
 98         }
 99         if(flag)
100         printf("1\n");
101     }
102 }

POJ 3905

时间: 2024-10-19 18:10:57

POJ 3905的相关文章

POJ 3905 Perfect Election(2-sat)

POJ 3905 Perfect Election 题目链接 思路:很裸的2-sat,就根据题意建边即可 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <algorithm> using namespace std; const int MAXNODE = 2005; struct TwoSet { int n; vec

POJ 3905 Perfect Election (初学2-Sat)

这篇从原理上理解2-sat如何转化成图论问题简述了如何了实现算法:http://wenku.baidu.com/view/31fd7200bed5b9f3f90f1ce2.html 总的来说2-sat有两种算法,一种用dfs染色搜索出一种解,一种用tarjan(判定是否有解)+拓扑排序构造出任意一个可行解. dfs从理论上复杂度很高,但是实际上远远达不到上界,而且可以按字典序搜索,实现也简单多了 大致题意: 有n个候选人,m组要求,每组要求关系到候选人中的两个人,"+i +j"代表i和

【图论】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问题,一般表现的形式为,每个点有两种方式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问题 现有一个由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

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is