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 ...
随机推荐
- SSL/TLS协议运行机制的概述
互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...
- 《精通C#》委托与事件(10章)
委托可用来解耦以及状态变化的实时通知,以及其他的一些作用,但是经验所限,目前还未遇见.网上的大多数例子都是类似于,使用委托,然后用console返回方法的返回值,有时候会在想,委托的通知如果是这样的话 ...
- 自定义Spring Security权限控制管理(实战篇)
上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...
- php HTTP Auth
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] != 'kuser' || $_SERVER['PHP_AUTH_ ...
- 读javascript高级程序设计17-在线检测,cookie,子cookie
一.在线状态检测 开发离线应用时,往往在离线状态时把数据存在本地,而在联机状态时再把数据发送到服务器.html5提供了检测在线状态的方法:navigator.onLine和online/offline ...
- Visual Studio Code中文文档(一)-快速入门
Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...
- JQuery,拼接字符串问题(求助)
Js代码 $("#span_btnSave").html(str1); 结果 <span id="span_btnSave"><button ...
- PDF 补丁丁 0.5.0.2273 测试版发布:修复崩溃问题,可自定义工具栏文本
新的测试版修复了编辑器在打开文件后再打开文件会崩溃的严重错误,以及一些小问题. 在一些小细节上作了调整,例如可自定义常用工具栏的文本等等. 由于之前测试版本的错误比较严重,推荐网友下载新的测试版.
- .net中如何发送HTTP请求网络资源
应用场景 应该说只要是需要通过发送Http请求获取网络资源的地方都要使用它,网络资源可以是指以URI来表示的资源,比如web api接口等. HttpWebRequest .net2.0 ~ .net ...
- number 数据类型的分析。
在js中,number数据类型可能算最令人关注的的类型之一了. number类型分为整数和浮点数. 一,整型数,整型又分为十进制,八进制,十六进制. 十进制即是生活中接触到的:而八进制数的首位必须是零 ...