地址 https://algospot.com/judge/problem/read/MEETINGROOM

解答  2-sat 代码样例过了 没有ac。 我又没有正确代码对拍。。。。。

已确认是输出问题 修改完成

 #include <algorithm>
#include <iostream>
#include <vector>
#include <stack> using namespace std; vector<vector<int>> adj; vector<int> sccId, discovered, finished;
stack<int> st; //保存顶点序号的栈
int sccCounter, vertexCounter; //返回以here为根节点的子树中
//能够到达后向边的最小发现顺序
int scc(int here) {
int ret = discovered[here] = vertexCounter++;
//将here存入栈,here的所有后代节点都会在here之后进栈
st.push(here); for (int i = ; i < adj[here].size(); ++i) {
int there = adj[here][i];
//(here,there)是树边
if (discovered[there] == -)
ret = min(ret, scc(there));
else if (discovered[there] < discovered[here] && finished[there] != )
ret = min(ret, discovered[there]);
} //判断here是否为强联通分量的根节点
if (ret == discovered[here]) {
//以here为根节点的子树中,将剩余所有顶点全部绑定为同一分量
while (true) {
int t = st.top();
st.pop();
sccId[t] = sccCounter;
if (t == here) break;
}
++sccCounter;
} finished[here] = ;
return ret;
} //tarjan 的scc算法
vector<int> tarjanSCC() {
//数组和计数器的初始化
sccId = discovered = finished = vector<int>(adj.size(), -);
sccCounter = vertexCounter = ; //对所有顶点调用scc()
for (int i = ; i < adj.size(); ++i)
if (discovered[i] == -) scc(i);
return sccId;
} //========================================================================
//图的领接表表示法
//vector<vector<int>> adj; bool disjoint(const pair<int, int>& a, const pair<int, int>& b) {
return a.second <= b.first || b.second <= a.first;
} //如果meetings[]表示各队提出的开会时间
//则将此题转换为2-SAT问题后生成蕴含图
//第i个团队需要选择meetings[2*i]或meetings[2*i+1]时候之一开会
void makeGraph(const vector<pair<int, int>>& meetings)
{
int vars = meetings.size(); //每个变量对应图的两个顶点
adj.clear(); adj.resize(vars * );
for (int i = ; i < vars; i += ) {
//各团队需要选择第i号和第j号会议之一
//添加(i or j )句子
int j = i + ;
adj[i * + ].push_back(j * );
adj[j * + ].push_back(i * );
} for (int i = ; i < vars; ++i) {
for (int j = ; j < i; ++j) {
//第i号会议和第j号会议重叠
if (!disjoint(meetings[i], meetings[j])) {
//放弃第i个会议 或者放弃第j个会议
//添加 (~i or ~j)子句
adj[i * ].push_back(j * + );
adj[j * ].push_back(i * + );
}
}
}
} vector<int> solve2SAT()
{
int n = adj.size() / ;
vector<int> label = tarjanSCC(); for (int i = ; i < * n; i += )
if (label[i] == label[i + ])
return vector<int>(); vector<int> value( * n, -); vector<pair<int, int>> order;
for (int i = ; i < * n; i++)
order.push_back(make_pair(label[i], i));
sort(order.begin(), order.end()); for (int i = ; i < * n; ++i) {
int vertex = order[i].second;
int variable = vertex / , isTrue = vertex % ;
if (value[variable] != -) continue;
value[variable] = !isTrue;
}
return value;
} int main()
{
int n;
cin >> n; while (n--) {
int m;
cin >> m;
vector<pair<int, int>> meetings;
while (m--) {
int a, b, c, d;
cin >> a >> b >> c >> d;
meetings.push_back(make_pair(a, b));
meetings.push_back(make_pair(c, d));
}
makeGraph(meetings); vector<int> v = solve2SAT();
if (v.empty()) {
cout << "IMPOSSIBLE" << endl;;
}
else {
cout << "POSSIBLE" << endl;
for (int i = ; i < v.size()/; i+=) {
if (v[i] == ) {
cout << meetings[i].first << ' ' << meetings[i].second << endl;
}
else {
cout << meetings[i+].first << ' ' << meetings[i+].second << endl;
}
}
}
} return ;
}

一份tarjan 模板

 // 11111111.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm> using namespace std; const int maxn = 2e5 + ;
vector<int> E[maxn];
int vis[maxn];
int dfn[maxn], low[maxn], tot, n, ans = maxn;
stack<int> s; void tarjan(int x)
{
low[x] = dfn[x] = ++ tot;
s.push(x); vis[x] = ; for (int i = ; i < E[x].size(); i++) {
int v = E[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]) {
int cnt = ;
while () {
int now = s.top();
s.pop();
vis[x] = ;
cnt++;
if (now == x) break;
}
if (cnt > ) ans = min(ans, cnt);
} } int main()
{
scanf("%d",&n );
for (int i = ; i <= n; i++) {
int x;
scanf("%d", &x);
E[i].push_back(x);
} for (int i = ; i <= n; i++) {
if (!dfn[i])
tarjan(i);
} cout << ans << endl; return ;
}

tarjan模板

算法问题实战策略 MEETINGROOM 附一份tarjan模板的更多相关文章

  1. 算法问题实战策略 PICNIC

    下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...

  2. 《算法问题实战策略》-chaper7-穷举法

    关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...

  3. 《算法问题实战策略》-chaper32-网络流

    基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...

  4. 《算法问题实战策略》-chaper13-数值分析

    这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...

  5. 《算法问题实战策略》——chaper9——动态规划法技巧

    Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1)    拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2)    棋盘中还剩 ...

  6. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...

  7. 《算法问题实战策略》-chaper21-树的实现和遍历

    这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...

  8. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  9. 算法问题实战策略 DICTIONARY

    地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...

随机推荐

  1. C#线程学习笔记一:线程基础

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...

  2. 松软科技web课堂:随机Math.random()

    Math.random() 返回 0(包括) 至 1(不包括) 之间的随机数: 实例 Math.random(); // 返回随机数 JavaScript 随机整数 Math.random() 与 M ...

  3. Delphi 调用C# 编写的DLL方法

    近来,因工作需要,必须解决Delphi写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个“ ...

  4. vue如何循环渲染element-ui中table内容

    对于大多数前端开发者来说,vuejs+element-ui是开发后台管理系统过程中必不可少的技术框架.而后台管理系统中,最常见的形式就是表格和表单,以便用来增删改查. element-ui中table ...

  5. MySQL Error Log 中IO写入瓶颈的警告分析

    周末在一台MySQL实例上频繁做大批量的写入测试,无意中发现MySQL的errorlog中频繁出现如下的Note:page_cleaner: 1000ms intended loop took *** ...

  6. jq实现回车键事件

    我们写系统的时候常常因为要点击显得很麻烦,习惯了回车键完成一些东西. 接下来就直接上代码吧.jq实现回车键事件 keyDowm: () => { $("body").keyd ...

  7. diango运行流程

    diango运行流程 Django处理一个请求的流程: 在浏览器的地址栏中输入地址,回车,发了一个GET请求 wsgi模块接收了请求,将请求的相关信息封装成request对象 根据地址找到对应函数 执 ...

  8. Github(第一次尝试)

    重要提示:项目中的文件最好最好不要出现中文,尤其是复杂的中文文件名. 前提:本地已经用git 管理 一个测试项目(项目一),分支为master. 1.注册 github: http://git.osc ...

  9. springioc之依赖注入

    1.1.2  IoC能做什么 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类 ...

  10. vue-cli3 用natapp 配置时 出现Invalid Host header的解决方案

    natapp 网址:https://natapp.cn/       用户名:137 **** ****   密码:26**_X** natapp 配置: 出现如下错误:Invalid Host he ...