题目传送

官方题解说的很好了,剩下的就是读大佬代码了,前面是tarjan求SCC缩点图。我图论没学过,接下来删点是怎么操作看得有点头秃,直到我看到了%%%安德鲁何神仙的代码。

按照题面连通紫线以后,我们姑且先考虑从入度为0的点着手看看是否可行。由于都是入度为0的点,所以现在我们连的都是绿边。

假如连了$$a\rightarrow b$$这条边,而又有$$b\rightarrow c$$这条紫边,那显然是要断开的,然后c如果入度为0,它也成为了一个候选。

这种做法会不会导致一开始a连向b的,然后我们把b删了,而a其实又不是最后答案、反而b是可行的呢?

无碍,当b最后可行时,意味着b会通过别的节点和绿边走到a,而a到b又有绿边,也就是这是个绿环,要么环内任意点为答案,要么外部点为答案,走通到环内,是肯定有答案的,所以删了b无碍。

这个做法就不需要SCC了。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <functional>
using namespace std; const int maxn = 1e5 + 5;
int n, m, used[maxn], indeg[maxn];
vector<int> adj[maxn];
queue<int> Q; int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0); cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
adj[u].push_back(v);
} function<void(int)> dfs = [&](int cur) {
if (used[cur]) return;
used[cur] = 1;
vector<int> tmp;
for (int son : adj[cur]) {
if (used[son] == 1) continue;
dfs(son);
tmp.push_back(son);
indeg[son]++;
}
used[cur] = 2;
adj[cur] = tmp;
}; for (int i = 1; i <= n; i++) dfs(i); for (int i = 1; i <= n; i++) {
if (!indeg[i]) {
Q.push(i);
}
} while (Q.size() >= 2) {
int a = Q.front(); Q.pop();
int b = Q.front(); Q.pop(); cout << "? " << a << ' ' << b << '\n' << flush;
int answer; cin >> answer; if (!answer) swap(a, b);
for (int i : adj[b]) {
if (!--indeg[i]) {
Q.push(i);
}
}
Q.push(a);
} cout << "! " << Q.front() << endl;
return 0;
}

Codeforces 1142E(图、交互)的更多相关文章

  1. Wizard's Tour CodeForces - 860D (图,构造)

    大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...

  2. UML-状态图,顺序图,活动图

    一.编写用例文档      1.用例的内容:   用例编号   用例名  执行者  前置条件  后置条件  基本路径  扩展路径  字段列表  业务规则                         ...

  3. Python设计模式 - UML - 通信图(Communication Diagram)

    简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...

  4. UI 交互

    动效设计 亮色优缺点 排版 原型图交互说明

  5. 关于如何在Windows下测交互题

    这里的交互题指的NOI风格的交互题,即交互库 codeforces风格的交互题...只能自己实现评测插件了 使用Cena,Lemon没有附加文件功能不能评测交互题 在编译选项g++编译命令源文件中加入 ...

  6. UML类图与时序图

    UML统一建模语言 结构式图形: 静态图(类图,对象图,包图) 实现图(组件图,部署图) 剖面图 复合结构图 行为式图形: 活动图 状态图 用例图 交互式图形: 通信图 交互概念图(2.0) 时序图( ...

  7. UML课程复习重点

    第一章 一.UML图示建模工具 二.UML--统一建模语言,以图形符号为基础,描述软件模型既简洁又清晰.它不是开发方法,是独立于任何开发方法之外的语言.它用于描述软件系统分析.设计和实施中的各种模型. ...

  8. 《利用python进行数据分析》读书笔记--第八章 绘图和可视化

    http://www.cnblogs.com/batteryhp/p/5025772.html python有许多可视化工具,本书主要讲解matplotlib.matplotlib是用于创建出版质量图 ...

  9. UML学习总结

    UML中的4+1模型 UML的4+1模型是一个叫Kruchten的人发明的,但网上还有其它版本的4+1 模型:Use case view, Logic view, Process view, Impe ...

随机推荐

  1. 服务化之Netty

    关于Netty的介绍可参考:https://www.zhihu.com/question/24322387 Netty官网为:http://netty.io/ Git:https://github.c ...

  2. Nginx的Location正则表达式

    location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. location的语法 已=开头表示精确匹 ...

  3. Spring MVC 注解开发详解

    @Controller控制器定义 1.Controller是单利模式,被多个线程请求共享,因此设计成无序状态. 2.通过@controller标注即可将class定义为一个controller类.为使 ...

  4. 使用diskpart命令修复U盘分区

    前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是这么容易 如下 ...

  5. POJ3728 THE MERCHANT LCA RMQ DP

    题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...

  6. [HAOI 2010] 计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2425 [算法] 类似与数位动态规划的思想 , 用组合数学进行简单推导即可 时间复杂度 ...

  7. HDU1083(最大匹配)

    Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  8. java 02 内部类

  9. bzoj1941

    KD-tree **了这道题 这个估价函数好鬼畜,把min打成max... 关于min的估价函数非常鬼畜,具体我也不知道为什么. #include<bits/stdc++.h> using ...

  10. String类无子类

    1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量 ...