基础但是很重要的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 ...
随机推荐
- 第五周PSP作业
PSP表格: 累积进度条: 折线图: 饼状图:
- "群英队"电梯演讲
视频如下: https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vi ...
- Alpha-end
前言 失心疯病源10 团队代码管理github 个人感悟 肝不动了,肝不动了.明天如果见不到我,不要太想我. 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 熬夜肝代码 代码签入git ...
- MySQL 日志功能详解
MySQL日志分类 1:查询日志 :query log 2:慢查询日志:slow_query_log 查询执行时长超过指定时长的查询操作所记录日志 3:错误日志:error log ...
- js登录界面代码自用
var btn = document.getElementById("a4"); var usne = document.getElementById("username ...
- Ubuntu系统下adb devices 不能显示手机设备
1. 查看usb设备,命令:lsusb 结果如下:Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub B ...
- hadoop和spark搭建记录
因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...
- 【bzoj4709】[Jsoi2011]柠檬 斜率优化
题目描述 给你一个长度为 $n$ 的序列,将其分成若干段,每段选择一个数,获得 $这个数\times 它在这段出现次数的平方$ 的价值.求最大总价值. $n\le 10^5$ . 输入 第 1 行:一 ...
- 【JavaScript】获取项目路径地址
在jsp页面顶上面定义 <% String path = request.getContextPath(); String basePath = request.getScheme() + &q ...
- P3469 [POI2008]BLO-Blockade
题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个城镇之间至多只有一条直接连接的道路.人们可以从任意一 ...