一条边<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. 修改XML指定标签的内容

    修改Xml指定标签内容(我这是去掉指定标签内容的空格) 其实就是个很简单的方法,需要的盆友直接拿走. test.xml <?xml version="1.0" encodin ...

  2. 【翻译】configuration changes与handler.post

    原文地址 http://corner.squareup.com/2013/12/android-main-thread-2.html 在前一部分里面previous part ,我们深入挖掘了 loo ...

  3. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  4. sql练习记录

    三表关联如果字段为0则表示是散客卡 select a.shop_id as id,b.shop_name,a.balance,a.point,(IF(a.card_type_id<>0,c ...

  5. CSS轮廓outline

    http://www.cnblogs.com/xiaohuochai/p/5277416.html

  6. Win10

    安装 调优 关闭cortana 对于SSD: 关闭windows search , superfetch服务,减少磁盘读写 关闭动画(个性化里面) 开启项优化 休眠文件(powercfg -h off ...

  7. Android中ActionBar的使用

    简介 从Android3.0开始(targetSdkVersion或者minSdkVersion为11或者更高),ActionBar被包括在了所有主题为Theme.holo(或者子类)的主题当中. 使 ...

  8. Android中的dp, px, pt

    定义: px是像素,表示屏幕显示的最小元素单位 pt是磅数,一磅等于1/72英寸,一般用来作为字体的单位使用 问题: px和pt不使用于手机,因为同样的px在高低分辨率的手机上显示的比例不同 解决办法 ...

  9. sqlserver 存储过程分页管理

    -- =============================================-- Author:  <Author:刘畅>-- Create date: <Cre ...

  10. 输出MYSQL所有SQL语句

    在my.cnf中的mysqld段增加如下参数,然后重启MYSQL: log-output = FILE general_log = 1 general_log_file = "D:/Visu ...