HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT
一条边<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的更多相关文章
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- Katu Puzzle POJ - 3678(水2 - sat)
题意: 有n个未知量,m对未知量之间的关系,判断是否能求出所有的未知量且满足这些关系 解析: 关系建边就好了 #include <iostream> #include <cstdio ...
- hdu 3062 Party 2-SAT
题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- hdu 3062+1824(2-sat入门)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 思路:根据矛盾关系连边(如果a与b矛盾,则连边a'->b,b'->a),然后强连通缩 ...
- 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 ...
- hdu 3062 2-sat入门题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 #include <cstdio> #include <cmath> # ...
- 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 ...
随机推荐
- JS 劫持来源网站并做指定跳转
有时候给网站做流量,免不了要做一些网站劫持的JS跳转,这里贴上一段劫持来源网站的JS跳转方法,很简单 <script> // 获取来源网站 var slyar = document.ref ...
- javascript实现列表的点击展开折叠
<script> window.onload = function() { //要折叠的区域 var catalog = document.getElementById("div ...
- 转: Rest简介及Spring实现
一 Roy Fielding 2000年Rest被Roy Fielding提出来的,我对Roy Fielding的印象有以下几个. 一是RoyFielding做为Http协议的起草者,在Http协议发 ...
- SQL基础语句(提升)
1.复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 2.拷贝表 insert into b(a,b,c) select d ...
- Java学习之多态
多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...
- iOS UISearchBar 设置取消按钮,回收键盘,并修改cancel为“取消”
继承协议: UISearchBarDelegate 在代理方法中设置: #pragma mark --- 搜索框开始编辑 --- - (void)searchBarTextDidBeginEditin ...
- redis-JedisPoolConfig配置
项目之前要使用redis这个临时缓存,下面是从别的大神那里转来的一些基本配置属性的说明: JedisPoolConfig config = new JedisPoolConfig(); //连接耗 ...
- xcode6.0以上创建一个Empty Application
运行Xcode 6,创建一个Single View Application工程. 创建好后,把工程目录下的Main.storyboard和LaunchScreen.xib删除,扔进废纸篓. 打 ...
- MFC -- 遍历Dialog中的子元素(控件)
CWnd *win = GetWindow(GW_CHILD);//获取第一个子控件 while(win) { win代表子控件,可以通过win来获取子控件的信息,如下述两行代码 //iCtrlId ...
- android 初步了解应用Gson 解析Json数据
1,因为没有服务器返回数据,对于Tomcat又懒得去配,所以我直接把数据写死到app中 先写一个实体类,便于操作 /** * 实体类 */ public class Person { int id ; ...