@atcoder - ARC092F@ Two Faced Edges
@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的更多相关文章
- Atcoder Regular Contest 092 D - Two Faced Edges(图论+bitset 优化)
Atcoder 题面传送门 & 洛谷题面传送门 orz ymx,ymx ddw %%% 首先既然题目要我们判断强连通分量个数是否改变,我们首先就将原图 SCC 缩个点呗,缩完点后我们很自然地将 ...
- AT3945-[ARC092D]Two Faced Edges【dfs】
正题 题目链接:https://www.luogu.com.cn/problem/AT3945 题目大意 \(n\)个点\(m\)条边的一张图,对于每条边求它翻转后强连通分量数量是否变化. \(1\l ...
- AT3945 [ARC092D] Two Faced Edges
要求,翻转一条边,强连通分量个数是否会改变. 考虑连通分量个数会改变的因素: 即\(v\to u\)是否成立,以及翻转前,是否有一条\(u \to v\)的路径不经过该条边 以上当只有一个满足时,连通 ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- 【AtCoder】ARC092
C - 2D Plane 2N Points 把能连边的点找到然后跑二分图匹配即可 #include <bits/stdc++.h> #define fi first #define se ...
- AtCoder Regular Contest 092 C D E F
C - 2D Plane 2N Points 题意 二维平面上有\(N\)个红点,\(N\)个蓝点,一个红点和一个蓝点能配成一对当且仅当\(x_r<x_b\)且\(y_r<y_b\). 问 ...
- atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges
题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...
- AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)
题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...
随机推荐
- js读取json
Json字符串是: [{"n":"aaa","un":"aaa"},{"n":"yang& ...
- Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc
问题 出现报错: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointc 原因 缺失两个库文件: as ...
- 设置TextField的响应View和toolBar
inputView 设置用于展示的响应View 类似于键盘的展示方式 inputAccessoryView 用于设置响应View上面的ToolBar 使用方式: inputView设置为响应View ...
- Windows系统下Git的下载和配置
简介:Git是一款免费.开源的分布式版本控制系统,可记录文件每次改动,便于多人协作编辑. 下载:git-for-windows下载地址https://git-for-windows.github.io ...
- Pyqt5_Python运用过程中一些问题和技巧
安装python3&pyqt5 1. 网下载python3.7安装包,安装时选择自定义安装,勾选上PIP 直接去官网上下载,一路下一步就可以了,然后将D:\Python37.D ...
- VueCli4构建项目如何配置文件路径别名?
1.在项目文件根目录上创建 vue.config.js 文件 2.写入以下代码,具体内容见注释: const path = require('path') // 引入path模块 function r ...
- 【C#图解教程学习笔记】第13章 委托
13.1 什么是委托 委托是持有一个或多个方法的对象,可将一个方法传递到另一个方法. 委托是用户自定义的引用类型. 13.2 委托概述 类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列 ...
- redis 启动停止重启
启动服务: service redis start 停止服务: service redis stop 重启服务: service redis restart
- Java Serializable(序列化)的总结
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...
- 搭建SpringCloud微服务框架:一、结构和各个组件
搭建微服务框架(结构和各个组件) 简介 SQuid是基于Spring,SpringBoot,使用了SpringCloud下的组件进行构建,目的是想搭建一套可以快速开发部署,并且很好上手的一套微服务框架 ...