HDU6072 Logical Chain
题意:动态修改图 \(G\) 的边集,求每次修改后的 \(\sum c\times (c−1) / 2\) (记每个强连通分量中的点数量为 \(c\) )。其中修改操作共 \(m\) 次,每次最多改 \(k\) 条边。\(1≤m≤25000,1≤k≤10\),图 \(G\) 中点数为 \(n\) ,\(1≤n≤250\)。
题解:\(tarjan\)由于要遍历所有边,复杂度 \(\mathcal{O}((V+E)\times m)\),在稠密图中效率较低;而使用邻接矩阵存储边集状态,利用 \(Kosaraju\) 解决的复杂度将达到 \(\mathcal{O}(V^2\times m)\) ,然后可以利用 bitset 优化边集的存储,加速后继点的查找,复杂度 \(\mathcal{O}(\frac{V^2\times M}{32})\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
} const int B=8,D=5,L=31,N=260;
struct bitset {
unsigned dat[B];
inline void reset() {memset(dat,0,B<<2);}
inline void set() {memset(dat,0xff,B<<2);}
inline void set(int x) {dat[x>>D]|=1u<<(x&L);}
inline void flip(int x) {dat[x>>D]^=1u<<(x&L);}
inline bool test(int x) {return dat[x>>D]>>(x&L)&1;}
}vis,e[N],re[N];
vector<int> s;
int n,m,num,T;
#define u32 unsigned
inline void dfs1(int u) {
vis.flip(u);
for(R i=0;i<B;++i) {
while(20040109) {
register u32 tmp=vis.dat[i]&e[u].dat[i];
if(!tmp) break;
dfs1(i<<D|__builtin_ctz(tmp));
}
} s.push_back(u);
}
inline void dfs2(int u) {
vis.flip(u),++num;
for(R i=0;i<B;++i) {
while(20021204) {
register u32 tmp=vis.dat[i]&re[u].dat[i];
if(!tmp) break;
dfs2(i<<D|__builtin_ctz(tmp));
}
}
}
inline void Kosaraju() {
s.clear(),vis.set(); R ans=0;
for(R i=0;i<n;++i) if(vis.test(i)) dfs1(i);
vis.set(); for(R i=n-1;~i;--i) {
if(vis.test(s[i])) {
num=0;
dfs2(s[i]);
ans+=num*(num-1)/2;
}
} printf("%d\n",ans);
}
inline void main() {
T=g(); while(T--) {
n=g(),m=g();
for(R i=0;i<n;++i) e[i].reset(),re[i].reset();
for(R i=0;i<n;++i) { register char s[N];
scanf("%s",s);
for(R j=0;j<n;++j) if(s[j]=='1')
e[i].flip(j),re[j].flip(i);
}
while(m--) { R t=g();
while(t--) { R u,v;
u=g(),v=g();
e[u-1].flip(v-1),re[v-1].flip(u-1);
} Kosaraju();
}
}
}
} signed main() {Luitaryi::main(); return 0;}
2019.12.18
HDU6072 Logical Chain的更多相关文章
- 【hdu6072】Logical Chain
Kosaraju算法,然後bitset優化 主要是學習一下自寫bitset的姿勢 #include<cstring> #include<algorithm> #include& ...
- HDU 6072 Logical Chain(Kosaraju+bitset)
http://acm.hdu.edu.cn/showproblem.php?pid=6072 题意: 给你$n*n$的矩阵,每次修改k条边,让你计算其中能相互到达的点对有多少. 思路: 其实就是求强连 ...
- Linux命令:read
在shell中,内建(builtin)命令read,格式如下: read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] ...
- man bash
BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [ ...
- bash5.0参考手册
Bash Reference Manual a.summary-letter { text-decoration: none } blockquote.indentedblock { margin-r ...
- [DFNews] Cellebrite UFED Logical/Physical Analyzer 3.8.1 维护性更新
Maintenance Release Cellebrite has released a maintenance version of UFED Physical / Log ...
- LVM Linear vs Striped Logical Volumes
转自:https://sysadmincasts.com/episodes/27-lvm-linear-vs-striped-logical-volumes About Episode - Durat ...
- Life of an Oracle I/O: tracing logical and physical I/O with systemtap
https://db-blog.web.cern.ch/blog/luca-canali/2014-12-life-oracle-io-tracing-logical-and-physical-io- ...
- PatentTips - Data Plane Packet Processing Tool Chain
BACKGROUND The present disclosure relates generally to systems and methods for providing a data plan ...
随机推荐
- 用python写一个简单的文件上传
用Pycharm创建一个django项目.目录如下: <!DOCTYPE html> <html lang="en"> <head> <m ...
- Go语言 (指针)
区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...
- 面试6 --- 当List<String> list =new ArrayList<String>(20); 他会扩容多少次
当List<String> list =new ArrayList<String>(20); 他会扩容多少次?A 0 B 1 C 2 D 3答案是A: 因为这个集合 ...
- Spring核心概念学习笔记
1.Spring主要用到两种设计模式 1.1 工厂模式 Spring容器就是实例化和管理全部Bean的工厂. 工厂模式可以将Java对象的调用者从被调用者的实现逻辑中分离出来. 调用者只关心被调用者必 ...
- 面试总结 转发(CSDN 博主)
1 https://blog.csdn.net/jackfrued/article/details/44921941 2 https://blog.csdn.net/jackfrued/article ...
- 有关mysql的utf8和utf8mb4,以及Illegal mix of collations for operation 'like'
参考以下几个帖子: https://www.cnblogs.com/install/p/4417527.html https://blog.csdn.net/Yetmoon/article/detai ...
- Spring 历史漏洞复现
1.Spring Security OAuth2.0 (CVE-2016-4977) 这个洞是由于Spring Security OAuth2.0的功能,在登录成功之后由于response_type不 ...
- Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException
转自:https://www.jb51.net/article/98644.htm Java xml出现错误 javax.xml.transform.TransformerException: jav ...
- RedisCluster的rename机制失败报错,解决又是数据倾斜问题
需求说明:spring session中的用户session更新是更新key的名字,所以对于key的操作时需要用newkey 替换oldkey value值只允许存在一个,这里用到rename就很合适 ...
- Tomcat启动超时设置
Tomcat启动超时设置: 处理方法: 1. 在server中找到当前Tomcat双击. 2.在视图中进行修改.(如下图:)