基础但是很重要的2-sat POJ 3678
http://poj.org/problem?id=3678
题目大意:就是给你n个点,m条边,每个点都可以取值为0或者1,边上都会有一个符号op(op=xor or and三种)和一个权值c。然后问你如何选择每个点的值,才能让所有点都满足x[i] op x[j] = c
思路:
这题学会了好多东西哇,至少我明白了xor,or,and这些关系如何建图拉
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
#include<iostream>
#include<utility>
#include<stack>
#include<stdlib.h>
#include<time.h>
#include<cmath>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
struct Tarjan{
int n;
int pre[maxn*], low[maxn*], sccno[maxn*], dfstime, scc_cnt;
stack<int> s;
vector<int> G[maxn*];
void init(int n){
this->n = n;
for (int i = ; i <= n * ; i++) G[i].clear();
while (!s.empty()) s.pop();
}
void add_edge(int x, int y){
G[x].push_back(y);
}
void dfs(int u){
pre[u] = low[u] = ++dfstime;
int len = G[u].size();
s.push(u);
for (int i = ; i < len; i++){
int v = G[u][i];
if (pre[v] == -){
dfs(v);
low[u] = min(low[u], low[v]);
}
else if (!sccno[v]){///下面为什么是pre[v]而不是low[v](两者都可以)
low[u] = min(low[u], pre[v]);///因为环装最后总会变回来,一样的
}
}
if (low[u] == pre[u]){
scc_cnt++;
while (true){
int x = s.top(); s.pop();
sccno[x] = scc_cnt;
if (x == u) break;
}
}
return ;
} bool solve(){///看情况修改solve
memset(pre, -, sizeof(pre));
memset(low, , sizeof(low));
memset(sccno, , sizeof(sccno));
dfstime = scc_cnt = ;
for (int i = ; i < * n; i++){
if (pre[i] == -) dfs(i);
}
for (int i = ; i < * n; i += ){///如果两个点在同一个环里面,那么就返回false
if (sccno[i] == sccno[i + ]) return false;
}
return true;
}
};
Tarjan tar;
int n, m; int main(){
while (scanf("%d%d", &n, &m) != EOF){
char ch[];
tar.init(n);
for (int i = ; i < m; i++){
int a, b, c; scanf("%d%d%d%s", &a, &b, &c, ch);
a = a * , b = b * ;///刚开始都是0
if (ch[] == 'A'){
if (c == ){///a
tar.add_edge(a ^ , a);
tar.add_edge(b ^ , b);
}
else {
tar.add_edge(a, b ^ );
tar.add_edge(b, a ^ );
}
}
else if (ch[] == 'O'){
if (c == ){
tar.add_edge(a ^ , b);
tar.add_edge(b ^ , a);
}
else {
tar.add_edge(a, a ^ );
tar.add_edge(b, b ^ );
}
}
else if (ch[] == 'X'){
if (c == ){
tar.add_edge(a, b ^ );
tar.add_edge(b ^ , a);
tar.add_edge(a ^ , b);
tar.add_edge(b, a ^ );
}
else {
tar.add_edge(a, b);
tar.add_edge(b, a);
tar.add_edge(a ^ , b ^ );
tar.add_edge(b ^ , a ^ );
}
}
}
if (tar.solve()) puts("YES");
else puts("NO");
}
return ;
}
具体可以看这个博客:http://www.hankcs.com/program/algorithm/poj-3678-katu-puzzle.html
基础但是很重要的2-sat POJ 3678的更多相关文章
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT
一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...
- java 基础题 很基础, 很有趣
都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们, ...
- MVC基础(很基础很基础~~~)
最近工作比较不忙,准备学习一些东西,作为一个菜鸟,不断学习新东西(我不会的东西)充实自己真的很重要,所以整理一下基础的mvc知识,以备不时之需.呵呵~~ 首先感谢原文作者:QLeelulu的文章htt ...
- NopCommerce开源项目中很基础但是很实用的C# Helper方法
刚过了个五一,在杭州到处看房子,不知道杭州最近怎么了,杭州买房的人这么多,房价涨得太厉害,这几年翻倍翻倍地涨,刚过G20,又要亚运会,让我这样的刚需用户买不起,也买不到房子,搞得人心惶惶,太恐怖了,心 ...
- C#多线程,基础知识很重要
本文通过介绍C#多线程的用法(基础玩法),附加介绍一下WinForm里边跨线程访问UI的方法 如图,就是这么一个简单的界面,每个按钮下面一个方法,分别设置文本框里边的内容,那么,开始吧! 先介绍一下W ...
- HDU 1301 Jungle Roads (最小生成树,基础题,模版解释)——同 poj 1251 Jungle Roads
双向边,基础题,最小生成树 题目 同题目 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stri ...
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
随机推荐
- HDU 5154 Harry and Magical Computer 有向图判环
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...
- nexus在linux上搭建
Maven 仓库的分类:(maven的仓库只有两大类) 1.本地仓库 2.远程仓库,在远程仓库中又分成了3种: 2.1 中央仓库 2.2 私服 2.3 其它公共库 有个maven私服可以很方便地管理我 ...
- 零拷贝Zero-Copy(NIO)
介绍 Java 的zero copy多在网络应用程序中使用.Java的libaries在linux和unix中支持zero copy,关键的api是java.nio.channel.FileChann ...
- 【计算机网络】NAT:网络地址转换
NAT(Network Address Translation,网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因 ...
- VS中碰到的问题
1.调试的时候,语句已经注释掉了,但是在执行的时候还是运行了(或者某些变量值改变后,程序依然用的之前数据). 右键解决方案-->清理,然后重新生成.
- 我的bootstrap学习
前端开发框架bootstrap Bootstrap 安装 <link ref="stylesheet" href="bs/css/bootstrap.css ...
- 【转】小心stringstream.str()字符串用法的陷阱
--------------------- 作者:心中那自由的世界 来源:CSDN 原文:https://blog.csdn.net/119365374/article/details/7744678 ...
- P1107 [BJWC2008]雷涛的小猫
题目描述 雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的).在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了. 可是有一天,雷涛下课回 ...
- 51nod 1317 相似字符串对(容斥原理+思维)
题意: 称一对字符串(A,B)是相似的,当且仅当满足以下条件: (1)字符串A和B都恰好包含N个字符: (2)A和B串中的每个字符都是小写字母的前k个字符,即A.B中只可能出现'a','b','c', ...
- redis2.8.xx安装配置
一.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...