一条边<u,v>表示u选那么v一定被选。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxm=;
const int Maxn=;
struct EDGE{int to,next;}edge[Maxm];
int T,m,Stack[Maxn],head[Maxn],Belong[Maxn],Id[Maxn],Dfn[Maxn],Low[Maxn],h1,h2,h,Stamp,scc,top,cnt;
bool vis[Maxn];
inline int Min(int x,int y) {return x>y?y:x;}
inline void Add(int u,int v){edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline bool Check()
{
for (int i=;i<T;i++) if (Belong[i<<]==Belong[i<<|]) return false;
return true;
}
void Tarjan(int u)
{
Stack[++top]=u; vis[u]=true;
Low[u]=Dfn[u]=++Stamp;
for (int i=head[u];i!=-;i=edge[i].next)
if (Dfn[edge[i].to]==-) Tarjan(edge[i].to),Low[u]=Min(Low[u],Low[edge[i].to]); else
if (vis[edge[i].to]) Low[u]=Min(Low[u],Dfn[edge[i].to]);
if (Dfn[u]==Low[u])
{
while (true)
{
int v=Stack[top--];
Belong[v]=scc;
vis[v]=false;
if (u==v) break;
}
scc++;
}
} int main()
{ while (scanf("%d%d",&T,&m)!=EOF)
{
for (int i=;i<T;i++)
{
scanf("%d%d%d",&h,&h1,&h2);
Id[h]=i<<;
Id[h1]=Id[h2]=i<<|;
}
memset(head,-,sizeof(head));
memset(Dfn,-,sizeof(Dfn));
cnt=Stamp=top=;
for (int i=;i<=m;i++)
{
scanf("%d%d",&h1,&h2);
Add(Id[h1],Id[h2]^),Add(Id[h2],Id[h1]^);
} for (int i=;i<T*;i++) if (Dfn[i]==-) Tarjan(i);
puts(Check()?"yes":"no");
}
return ;
}

HDU 1824

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxm=;
const int Maxn=;
struct EDGE{int to,next;}edge[Maxm];
int head[Maxn],Dfn[Maxn],Low[Maxn],Belong[Maxn],scc,Stk[Maxn],top,cnt,Stamp,n,m;
int p1,p2,c1,c2;
bool vis[Maxn];
inline int Min(int x,int y) {return x>y?y:x;}
inline int Id(int num,int pos){return (num<<)+pos+;}
inline void Add(int u,int v) {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline bool Check()
{
for (int i=;i<n;i++) if (Belong[Id(i,)]==Belong[Id(i,)]) return false;
return true;
}
void Tarjan(int u)
{
Stk[++top]=u; vis[u]=true;
Dfn[u]=Low[u]=++Stamp;
for (int i=head[u];i!=-;i=edge[i].next)
if (Dfn[edge[i].to]==-) Tarjan(edge[i].to),Low[u]=Min(Low[u],Low[edge[i].to]); else
if (vis[edge[i].to]) Low[u]=Min(Low[u],Dfn[edge[i].to]);
if (Low[u]==Dfn[u])
{
while (true)
{
int v=Stk[top--];
vis[v]=false;
Belong[v]=scc;
if (v==u) break;
}
scc++;
}
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-,sizeof(head));
memset(Dfn,-,sizeof(Dfn));
memset(Belong,,sizeof(Belong));
cnt=top=scc=;
for (int i=;i<=m;i++)
{
scanf("%d%d%d%d",&p1,&p2,&c1,&c2);
Add(Id(p1,c1),Id(p2,-c2)),Add(Id(p2,c2),Id(p1,-c1));
}
for (int i=;i<=*n;i++) if (Dfn[i]==-) Tarjan(i);
puts(Check()?"YES":"NO");
}
return ;
}

HDU 3062

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=;
const int Maxm=;
int One[Maxn],Zero[Maxn],Stack[Maxn],Belong[Maxn],head[Maxn],Low[Maxn],Dfn[Maxn],n,m,u,v,w,cnt,Stamp,scc,top;
bool vis[Maxn];
char ch[];
struct EDGE{int to,next;}edge[Maxm];
inline int Min(int x,int y){return x>y?y:x;}
inline void Add(int u,int v){edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline bool Check()
{
for (int i=;i<n;i++) if (Belong[One[i]]==Belong[Zero[i]]) return false;
return true;
}
void Tarjan(int u)
{
Stack[++top]=u; vis[u]=true;
Low[u]=Dfn[u]=++Stamp;
for (int i=head[u];i!=-;i=edge[i].next)
if (Dfn[edge[i].to]==-) Tarjan(edge[i].to),Low[u]=Min(Low[u],Low[edge[i].to]); else
if (vis[edge[i].to]) Low[u]=Min(Low[u],Dfn[edge[i].to]);
if (Low[u]==Dfn[u])
{
while (true)
{
int v=Stack[top--];
vis[v]=false;
Belong[v]=scc;
if (u==v) break;
}
scc++;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<n;i++) One[i]=i<<,Zero[i]=i<<|;
memset(head,-,sizeof(head));
memset(Dfn,-,sizeof(Dfn));
for (int i=;i<=m;i++)
{
scanf("%d%d%d%s",&u,&v,&w,ch);
if (ch[]=='A')
{
if (w==) Add(Zero[u],One[u]),Add(Zero[v],One[v]);
if (w==) Add(One[u],Zero[v]),Add(One[v],Zero[u]);
}
if (ch[]=='O')
{
if (w==) Add(Zero[u],One[v]),Add(Zero[v],One[u]);
if (w==) Add(One[v],Zero[v]),Add(One[u],Zero[u]);
}
if (ch[]=='X')
{
if (w==) Add(One[u],Zero[v]),Add(Zero[u],One[v]),Add(Zero[v],One[u]),Add(One[v],Zero[u]);
if (w==) Add(One[u],One[v]),Add(One[v],One[u]),Add(Zero[u],Zero[v]),Add(Zero[v],Zero[u]);
}
} for (int i=;i<n<<;i++) if (Dfn[i]==-) Tarjan(i);
puts(Check()?"YES":"NO");
return ;
}

POJ 3678

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxm=;
int Stk[Maxm],Low[Maxm],Dfn[Maxm],head[Maxm],Belong[Maxm],In[Maxm],Out[Maxm],Pos[Maxm];
int cnt,top,Stamp,KASE,scc,n,m,x,u[Maxm],v[Maxm],tot;
bool vis[Maxm];
struct EDGE{int to,next;}edge[Maxm<<];
inline int Min(int x,int y) {return x>y?y:x;}
inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
inline void Add(int u,int v) {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline bool Check()
{
for (int i=;i<=m;i++) if (Belong[In[i]]==Belong[Out[i]]) return false;
return true;
}
void Tarjan(int u)
{
Stk[++top]=u; vis[u]=true;
Low[u]=Dfn[u]=++Stamp;
for (int i=head[u];i!=-;i=edge[i].next)
if (Dfn[edge[i].to]==-) Tarjan(edge[i].to),Low[u]=Min(Low[u],Low[edge[i].to]); else
if (vis[edge[i].to]) Low[u]=Min(Low[u],Dfn[edge[i].to]);
if (Low[u]==Dfn[u])
{
while (true)
{
int v=Stk[top--];
vis[v]=false;
Belong[v]=scc;
if (u==v) break;
}
scc++;
}
}
int main()
{
scanf("%d",&KASE);
for (int Kase=;Kase<=KASE;Kase++)
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++) scanf("%d%d",&u[i],&v[i]);
for (int i=;i<=n;i++) scanf("%d",&x),Pos[x]=i;
if(m>*n-){puts("NO");continue;}
for (int i=;i<m;i++) In[i+]=i<<,Out[i+]=i<<|;
tot=;
for (int i=;i<=m;i++)
{
u[i]=Pos[u[i]],v[i]=Pos[v[i]];
if (v[i]<u[i]) Swap(u[i],v[i]);
if ((v[i]-u[i]==) || (v[i]==n && u[i]==)) continue;
u[++tot]=u[i],v[tot]=v[i];
}
m=tot;
memset(Dfn,-,sizeof(Dfn));
memset(head,-,sizeof(head));
memset(vis,false,sizeof(vis));
Stamp=cnt=top=scc=; for (int i=;i<=m;i++)
for (int j=i+;j<=m;j++)
if (((u[i]<u[j] && u[j]<v[i] && v[i]<v[j]) || (u[j]<u[i] && u[i]<v[j] && v[j]<v[i])))
Add(In[i],Out[j]),Add(In[j],Out[i]),Add(Out[i],In[j]),Add(Out[j],In[i]); for (int i=;i<m<<;i++) if (Dfn[i]==-) Tarjan(i);
puts(Check()?"YES":"NO");
}
return ;
}

BZOJ 1997

HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT的更多相关文章

  1. poj 3678 Katu Puzzle(Two Sat)

    题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...

  2. Katu Puzzle POJ - 3678(水2 - sat)

    题意: 有n个未知量,m对未知量之间的关系,判断是否能求出所有的未知量且满足这些关系 解析: 关系建边就好了 #include <iostream> #include <cstdio ...

  3. hdu 3062 Party 2-SAT

    题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...

  4. POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9987   Accepted: 3741 Descr ...

  5. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

  6. hdu 3062+1824(2-sat入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 思路:根据矛盾关系连边(如果a与b矛盾,则连边a'->b,b'->a),然后强连通缩 ...

  7. Hdu 3887 Counting Offspring \ Poj 3321 Apple Tree \BZOJ 1103 [POI2007]大都市meg

    这几个题练习DFS序的一些应用. 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1.C x y     以节点x的权值修改为y. 2.Q x ...

  8. hdu 3062 2-sat入门题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 #include <cstdio> #include <cmath> # ...

  9. hdu 2544 hdu 1874 poj 2387 Dijkstra 模板题

    hdu 2544  求点1到点n的最短路  无向图 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 ...

随机推荐

  1. android webview远程调试

    H5的调试的方式一般用chrome的emulator就好,可是遇到APP就拙计了.这时候还得用远程调试,远程调试很给力,不过目前网上还没有好的文章讲解,要好好的把其配置下来还是非常有难度的,今天折腾了 ...

  2. 学习PYTHON之路, DAY 3 - PYTHON 基础 3 (函数)

    一 set 集合 (无序且不重复的元素集合) 基本操作: t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 删除一项: t.discard('H') t ...

  3. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

  4. Java—输入输出技术

    在Java中,通过java.io包提供的类来表示流,基本的输入输出流为InputStream和OutputStream.从这两个基本的输入输出流派生出面向特定处理的流,如缓冲区读写流.文件读写流等. ...

  5. android事件拦截处理机制详解

    前段时间刚接触过Android手机开发,对它的事件传播机制不是很了解,虽然网上也查了相关的资料,但是总觉得理解模模糊糊,似是而非,于是自己就写个小demo测试了一下.总算搞明白了它的具体机制.写下自己 ...

  6. vs安装后当切换到图形设计界面的时候自动弹出“正在准备安装的提升”,然后程序处于假死状态

    Vs2008 安装后当切换到图形设计界面的时候自动弹出 ”正在准备安装的提示“,然后程序处于假死状态 在网上找了很多,最终解决问题:  从vs2008安装光盘中找到 /WCU/WebDesignerC ...

  7. Linux 设备驱动程序 字符设备

    已经无法再精简,适合入门. #include<linux/module.h> #include<linux/init.h> #include<asm/uaccess.h& ...

  8. QT 做软件盘

    最近搞了一个组织细胞脱水机项目,当然,对于国内的项目都是仿来仿去的,我们也不例外,开启被仿机器后,第一个看到的界面就是用户登录界面,需要输入中文,作为一个程序员,我的第一反应就是我需要采用什么用的框架 ...

  9. 打造基于CentOS7的xfce最简工作环境

    参考这里:http://blog.csdn.net/smstong/article/details/44802989没成功. 又参考这里http://jensd.be/125/linux/rhel/i ...

  10. 初学者的python学习笔记2——作业篇

    这次的作业是商城展示,最开始的确是一脸懵逼,后来研究了一下网上的例子,总算是搞出来了一个(其实算是网上列子的简化版?). 最开始是想要使用字典去做,发现显示列表的时候怎么也无法实现序号和名称对应,原因 ...