您的位置:首页 > 其它

poj 3678 (如何根据 布尔运算 来建图 跑 2-sat)

2017-04-10 20:36 232 查看
#include<cstdio>
#include<cstring>
#define MAX_N 2017
using namespace std;
bool map[MAX_N][MAX_N],vis[MAX_N],rmap[MAX_N][MAX_N];
int stack[MAX_N],cmp[MAX_N];
int tot=0,n;
void dfs(int i)
{
vis[i]=1;
for(int j=0;j<2*n;j++)
{
if(!vis[j]&&map[i][j])
dfs(j);
}
stack[tot++]=i;
}
void rdfs(int i,int k)
{
vis[i]=1;
cmp[i]=k;
for(int j=0;j<2*n;j++)
{
if(!vis[j]&&rmap[i][j])
rdfs(j,k);
}
}
int scc()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<2*n;i++)
{
if(!vis[i])
dfs(i);
}
int k=0;
memset(vis,0,sizeof(vis));
for(int i=tot-1;i>=0;i--)
{
if(!vis[stack[i]])
rdfs(stack[i],k++);
}
return k;
}
int main()
{
int m,a,b,c;
char str[10];
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d %s",&a,&b,&c,str);
if(str[0]=='A')
{
if(c==1)
{
map[a+n][a]=1;
map[b+n][b]=1;
rmap[a][a+n]=1;
rmap[b][b+n]=1;
}
else
{
map[a][b+n]=1;
map[b][a+n]=1;
rmap[b+n][a]=1;
rmap[a+n][b]=1;
}
}
else if(str[0]=='O')
{
if(c==1)
{
map[a+n][b]=1;
map[b+n][a]=1;
rmap[b][a+n]=1;
rmap[a][b+n]=1;
}
else
{
map[a][a+n]=1;
map[b][b+n]=1;
rmap[a+n][a]=1;
rmap[b+n][b]=1;
}

}
else
{
if(c==1)
{
map[a][b+n]=1;
map[b+n][a]=1;
map[a+n][b]=1;
map[b][a+n]=1;
rmap[b+n][a]=1;
rmap[a][b+n]=1;
rmap[b][a+n]=1;
rmap[a+n][b]=1;
}
else
{
map[a][b]=1;
map[b][a]=1;
map[a+n][b+n]=1;
map[b+n][a+n]=1;
rmap[b][a]=1;
rmap[a][b]=1;
rmap[b+n][a+n]=1;
rmap[a+n][b+n]=1;
}
}
}
int k=scc();
int flag=0;
for(int i=0;i<n;i++)
{
if(cmp[i]==cmp[i+n])
{
flag=1;
break;
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 联通