@description@

给出一个有向图,对每条边都做一次询问:

翻转这条边后,对原图的强连通分量是否有影响?

点的个数 N ≤ 1000,边的个数 M ≤ 200000。

原题传送门。

@solution@

看到 5s 时限,大胆猜测时间复杂度 O(NM)。

一条边 u->v 翻转造成的影响:

如果这条边在强连通分量里(等价于存在路径 v 到 u),当不存在另一条路径 u 到 v 时,则翻转后强连通减少。

如果不在,当存在另一条路径 u 到 v 时,则翻转后强连通增加。

也就是说对于一条边 u->v,我们需要判两个东西:是否存在 v 到 u 的路径;是否存在另一条 u 到 v 的路径。

前一个暴力 O(NM) 就可以做了,不需要再另外写一个强连通。

至于后一个。我们考虑另一条路径意味着什么:存在一条以 u 为起点且中途不经过 u,第一条边不是 u->v 的路径。

那么对于每一个点 u 搜索全图,判断到达每个点 x 的路径第一条边是否只有一种。

这个随便怎么搜都可以,因为每个点的状态只会被更新两次(只有一种,多于一种)。

@accepted code@

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std; const int MAXN = 1000;
const int MAXM = 200000; vector<int>G[MAXN + 5]; int to[MAXM + 5];
void addedge(int u, int i) {G[u].push_back(i);} int tag[MAXN + 5], que[2*MAXN + 5];
bool ans1[MAXM + 5], ans2[MAXM + 5]; int n, m;
int main() {
scanf("%d%d", &n, &m);
for(int i=1;i<=m;i++) {
int a; scanf("%d%d", &a, &to[i]);
addedge(a, i);
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) tag[j] = 0;
int s = 1, t = 0;
for(int p=0;p<G[i].size();p++)
tag[que[++t] = to[G[i][p]]] = G[i][p];
while( s <= t ) {
int x = que[s++], y = tag[x];
for(int p=0;p<G[x].size();p++) {
int q = to[G[x][p]];
if( q != i ) {
if( tag[q] != -1 ) {
if( tag[q] == 0 )
tag[que[++t] = q] = y;
else if( tag[q] != y )
tag[que[++t] = q] = -1;
}
}
else ans1[G[x][p]] = 1;
}
}
for(int p=0;p<G[i].size();p++)
if( tag[to[G[i][p]]] == -1 ) ans2[G[i][p]] = 1;
}
for(int i=1;i<=m;i++)
puts(ans1[i] ^ ans2[i] ? "diff" : "same");
}

@details@

像这种稠密图,用 vector 存储比链式前向星存储更快(对 cache 更友好)。特别是这种常数影响极大的题。

至于 cache 是个啥。。。根据我 THUWC2020 的参赛所学,大概就是除了内存以外, cpu 自己有一个更近的临时空间叫 cache。

如果你一直访问同一个元素的话,对 cache 是非常友好,因此也就会更快。

@atcoder - ARC092F@ Two Faced Edges的更多相关文章

  1. Atcoder Regular Contest 092 D - Two Faced Edges(图论+bitset 优化)

    Atcoder 题面传送门 & 洛谷题面传送门 orz ymx,ymx ddw %%% 首先既然题目要我们判断强连通分量个数是否改变,我们首先就将原图 SCC 缩个点呗,缩完点后我们很自然地将 ...

  2. AT3945-[ARC092D]Two Faced Edges【dfs】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3945 题目大意 \(n\)个点\(m\)条边的一张图,对于每条边求它翻转后强连通分量数量是否变化. \(1\l ...

  3. AT3945 [ARC092D] Two Faced Edges

    要求,翻转一条边,强连通分量个数是否会改变. 考虑连通分量个数会改变的因素: 即\(v\to u\)是否成立,以及翻转前,是否有一条\(u \to v\)的路径不经过该条边 以上当只有一个满足时,连通 ...

  4. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  5. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  6. 【AtCoder】ARC092

    C - 2D Plane 2N Points 把能连边的点找到然后跑二分图匹配即可 #include <bits/stdc++.h> #define fi first #define se ...

  7. AtCoder Regular Contest 092 C D E F

    C - 2D Plane 2N Points 题意 二维平面上有\(N\)个红点,\(N\)个蓝点,一个红点和一个蓝点能配成一对当且仅当\(x_r<x_b\)且\(y_r<y_b\). 问 ...

  8. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

  9. AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)

    题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...

随机推荐

  1. BZOJ1018线段树

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3489  Solved: 1168[Submi ...

  2. Pyqt5_QlineEdit

    QlineEdit 方法 setAlignment() 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右对齐 Qt.AlignCenter:水 ...

  3. Java线程的启动与中止

    一.线程与进程的关系 关于进程与线程,百度百科上是这样描述的: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当 ...

  4. ansible模块详解

    [简单介绍] Ansible是一种agentless(基于ssh),可实现批量配置.命令执行和控制,基于Python实现的自动化运维工具. 有以下两个特性: 模块化:通过调用相关模块,完成指定任务,且 ...

  5. Java IO(十九)PrintStream 和 PrintWriter

    Java IO(十九)PrintStream 和 PrintWriter 一.介绍 (一).PrintStream PrintStream 是打印输出流,它继承于FilterOutputStream. ...

  6. Python编程基本规范

    1.命名规范 类:类的名称一般为名词,且以驼峰形式(即每个单词首字母要大写,其余字母小写,单词之间无间隔符号)给出. 函数:一般以动词开头,函数名称要准确.简要地概括本函数的作用.函数名一律小写,如有 ...

  7. FHQ-Treap学习笔记

    平衡树与FHQ-Treap 平衡树(即平衡二叉搜索树),是通过一系列玄学操作让二叉搜索树(BST)处于较平衡的状态,防止在某些数据下退化(BST在插入值单调时,树形不平衡,单次会退化成 \(\math ...

  8. 00016-layui 动态加载菜单 laytpl

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ i ...

  9. Cypress系列(3)- Cypress 的初次体验

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 这里的栗子项目时 Cypress ...

  10. 腾讯云EMR大数据实时OLAP分析案例解析

    OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过QQ音乐与腾 ...