POJ2723 Get Luffy Out解题报告tarjan+2-SAT+二分
今天看到讲2-SAT比较好的blog,感觉微微的理解了2-SAT
参考: https://blog.csdn.net/leolin_/article/details/6680144
题意:你有2*n把钥匙,但是在每一对钥匙中,用了a,就不能用b。你要用这么多钥匙去开尽可能多的门。开门的规则是:每个门对于两把钥匙,用一把去开就ok。
注意2的10次方一点都不大~~1000。
思路:注意开门是有顺序的,所以可以二分答案,每次用mid值规定的门数去建一个图,跑一边tarjan缩点,再check一下i和i+2*n,若是同一个缩点块中,则false(2-sat思想);
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <iterator> using namespace std; #define pb push_back const int maxn = +;
int n,m;
int key[maxn][],locks[maxn][];
int low[maxn],dfn[maxn],vis[maxn],belong[maxn],scc,tot;
stack<int>s;
vector<int>mp[maxn]; void tarjan(int x)
{
dfn[x] = low[x] = ++tot;
s.push(x);vis[x] = ;
for(int i=; i<mp[x].size(); i++)
{
int v = mp[x][i];
if(dfn[v]==)
{
tarjan(v);
low[x] = min(low[x],low[v]);
}
else if(vis[v])
{
low[x] = min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x])
{
scc++;
while()
{
int tmp = s.top();
s.pop();
vis[tmp] = ;
belong[tmp] = scc;
if(tmp==x)break;
}
}
}
void init()
{
for(int i=; i<=*n; i++)mp[i].clear();
}
void build(int x)
{
init();
for(int i=; i<=n; i++) //因为mp不得不清空.所以连这个也要重新建
{
int a = key[i][],b = key[i][];
mp[a].pb(b+*n);
mp[b].pb(a+*n);
}
for(int i=; i<=x; i++)
{
int a = locks[i][],b = locks[i][]; mp[a+*n].pb(b); //对于开门来说,不用这把,就要用另一把钥匙;
if(a!=b)mp[b+*n].pb(a);
}
} void ini(){
while(!s.empty())s.pop();
scc = tot = ;
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
memset(belong,,sizeof(belong));
}
bool check(){
ini();
for(int i=; i<=*n; i++)
{
if(dfn[i]==)tarjan(i);
}
for(int i=; i<=*n; i++)
if(belong[i]==belong[i+*n])
return false;
return true;
}
int main(){
while(~scanf("%d%d", &n, &m)&&n+m)
{
for(int i=; i<=n; i++)
{
scanf("%d%d",&key[i][],&key[i][]);
key[i][]++,key[i][]++;
}
for(int i=; i<=m; i++)
{
scanf("%d%d", &locks[i][], &locks[i][]);
locks[i][]++,locks[i][]++;
} int le = ,ri = m; //二分范围不要乱写!
int ans;
while(le<=ri)
{
int mid = (le + ri)>>;
build(mid);
if(check())
{
ans = mid;
le = mid + ;
}
else ri = mid - ;
}
printf("%d\n",ans);
}
return ;
}
POJ2723 Get Luffy Out解题报告tarjan+2-SAT+二分的更多相关文章
- hrbustoj 1494(原题UVA 315 Network) 解题报告 tarjan求割点
主要思路:使用tarjan选取一个根节点建立一个棵搜索树,判断一个点是割点的充分必要条件是,对于一个节点u如果他的孩子节点v的low值大于等于u的出生日期dfn值,进行下一步判断,如果u是我们选的根节 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 【NOIP2015】提高组D1 解题报告
P1978神奇的幻方 Accepted 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时 ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
随机推荐
- chapter01作业
1. 请用命令查出ifconfig命令程序的绝对路径 [root@localhost chen]# which ifconfig /usr/sbin/ifconfig 2.请用命令展示以下命令哪些是内 ...
- 【iOS】删除 main.storyboard 的问题
一直没用 main.storyboard, 后来索性把它删了,结果还出了问题: Terminating app due to uncaught exception 'NSInvalidArgument ...
- 【iOS】Receiver type 'XXX' for instance message is a forward declaration
今天遇到这个错误.刚开始字体太大,没显示全,后来调小字体之后看到了完整提示信息: 之后就忽然想起没引入相关的类,添加 #import "RDVTabBarItem.h" 就行了.
- hdu 6397 Character Encoding (生成函数)
Problem Description In computer science, a character is a letter, a digit, a punctuation mark or som ...
- v-text,v-html等区别
首先我们知道vue中有很多自定义指令,以v- 开头,例如:v-text,v-bind,v-model, v-if,等 在这些指令中,部分指令之间是很容易被混淆,所以今天决定自己总结一下以下几个相似指令 ...
- Keil5调试过程中遇到的一些警告和错误
最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void r ...
- [Spring cloud 一步步实现广告系统] 14. 全量索引代码实现
上一节我们实现了索引基本操作的类以及索引缓存工具类,本小节我们开始实现加载全量索引数据,在加载全量索引数据之前,我们需要先将数据库中的表数据导出到一份文件中.Let's code. 1.首先定义一个常 ...
- 科普向 + 折腾向 ——你了解磁盘、分区、文件系统、GPT、UEFI吗?在笔记本上安装五个系统是怎样的体验?
[Windows 7 + Windows 8 (PE) + Windows 10 + deepin-Linux + MacOS X] 前言:随着软硬件技术的发展UEFI引导逐渐取代传统BIOS引导,最 ...
- LCA最近公共祖先---倍增法笔记
先暂时把模板写出来,A几道题再来补充 此模板也是洛谷上的一道模板题 P3379 [模板]最近公共祖先(LCA) #pragma GCC optimize(2) //o2优化 #include < ...
- React预备知识点
1.react中的状态提升 react的状态提升就是用户对子组件操作,子组件不改变自己的状态,而是通过自己的props把操作改变的数据传递给父组件,改变父组件的状态,从而改变受父组件控制的所有子组件的 ...