一条边<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. beat your own python env

    1,进入根目录,修改.bashrc,增加一个PATH目录 例如:alias cjtf='export PATH=/home/www/xxx/python_env:$PATH' 如果个人的机器的就不用a ...

  2. web.config 修改数据库连接

    <connectionstrings> </database=数据库名字 ;uid = 登录数据库的名字;Password = 登录数据库的密码;/> </connect ...

  3. java selenium (四) 使用浏览器调试工具

    在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试.   首先我们需要查找和识别UI元素. 在基于Web UI 自动化测试中, 测试人员需要了解HTML, CSS和 ...

  4. whereis 和which

    这两个命令用的好,可以很快找出文件的路径 [root@oc3408554812 zip-3.0]# which passwd/usr/bin/passwd[root@oc3408554812 zip- ...

  5. ORM

    参考:http://wenku.baidu.com/link?url=Kc9KHESrzLUp8KtcQH4Ls4QQpKosNiyQAVgkNX-UN4j9QuRhS-Hy5FGJjmWW2oszT ...

  6. μC/OS-Ⅲ系统中的任务种类及基本状态

    在μC/OS-Ⅲ系统中,任务自身一共有五种状态. 1.休眠态 调用函数OSTaskCreate()创建任务后,任务就可以接受μC/OS-Ⅲ的管理.处于休眠态的任务代码实际上已经写入代码空间中了,但是μ ...

  7. Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFo ...

  8. List 集合线程安全测试

    最近在做一些代码整理工作,涉及到List 线程安全问题,查了一些资料.网上有些资料说List 增减成员(Add , Remove) 是安全的,但不保证成员属性值访问安全性,及禁止对 List 跨线程遍 ...

  9. 【转】2014年25款最好的jQuery插件

    2014年25款最好的jQuery插件 来源:Specs' Blog-就爱PHP   时间:2014-12-30 10:24:10   阅读数:2267 分享到: 0 http://www.php10 ...

  10. MS SQL提示列名 'Y' 无效的原因及解决办法

    在作项目写MS SQL 存储过程时,需拼接SQL语句字符串,其中有单字符变量,如下图: 如上图执行存储过程是提示“列名‘Y’无效”.经反复测试,原因在用单字符变量连接SQL字符串是必须在引用变量前后各 ...