HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
来源:互联网 发布:游戏编程要学java 编辑:程序博客网 时间:2024/06/17 19:32
Problem
Every time you come across a problem you’ve never seen before, haven’t you thought of something that is familiar to you? If so, you might think of something else, then more and more things will come to your mind. This is what is called ”Logical Chain”. Lu Xun’s work also described such interesting phenomenon.
Assume there are n things, labeled by 1,2,…,n. Little Q’s mind can be expressed by a n×n matrix g. If he can think of j when he comes across i, then
Little Q’s mind changes all the time. On i-th day, there are ki positions (u,v) in matrix g flipped(0 to 1 and 1 to 0). Please write a program to figure out the number of ”Looping Pairs” after each day’s all changes.
Note : (u,v) and (v,u) should not be counted twice.
此题动态修改图 G 的边集,求每次修改后的
其中修改操作共 m 次,每次最多改 k 条边。
图 G 中点数为 n ,
Idea
此题动态修改图 G 的边集,求每次修改后的
求强连通分量,已有的算法有 Tarjan
使用邻接矩阵存储边集状态,利用 Kosaraju 解决的复杂度将达到
Code
#include<bits/stdc++.h>using namespace std;const unsigned MAXU = (1llu<<32) - 1;const int N = 256;int T, n, m, k, u, v, rev[N], idx, cnt, ans;struct BITSET { unsigned b[8]; int size; void reset() { memset(b, 0, sizeof(b)); } void reset(int pos) { b[pos>>5] &= MAXU ^ (1u<<(pos&31)); } void set() { memset(b, 0xff, sizeof(b)); } void set(int pos) { b[pos>>5] |= (1u<<(pos&31)); } void flip(int pos) { b[pos>>5] ^= (1u<<(pos&31)); } bool test(int pos) { return b[pos>>5] & (1u<<(pos&31)); }} g[N], gt[N], vis;char s[N];void dfs(int rt) { if(vis.test(rt)) return; vis.set(rt); for(int i=0;i<8;i++) while(true) { unsigned x = g[rt].b[i] - (g[rt].b[i] & vis.b[i]); if(!x) break; dfs((i<<5) | (__builtin_ctz(x))); } rev[++idx] = rt;}void rev_dfs(int rt) { vis.flip(rt); cnt++; for(int i=0;i<8;i++) while(true) { unsigned x = gt[rt].b[i] - (gt[rt].b[i] & vis.b[i]); if(!x) break; rev_dfs((i<<5) | (__builtin_ctz(x))); }}void kosaraju() { ans = 0; vis.reset(); vis.set(0); for(int i=n+1;i<256;i++) vis.set(i); idx = 0; for(int i=1;i<=n;i++) if(!vis.test(i)) dfs(i); vis.reset(); vis.set(0); for(int i=n+1;i<256;i++) vis.set(i); for(idx=n;idx;idx--) { if(vis.test(rev[idx])) continue; cnt = 0; rev_dfs(rev[idx]); ans += cnt * (cnt-1) / 2; }}int main(){ scanf("%d", &T); while(T-- && scanf("%d %d", &n, &m)!=EOF) { for(int i=1;i<=n;i++) g[i].reset(), gt[i].reset(); for(int i=1;i<=n;i++) { scanf(" %s", s+1); for(int j=1;j<=n;j++) if(s[j] == '1') { g[i].set(j); gt[j].set(i); } } while(m-- && scanf("%d", &k)) { for(int i=1;i<=k;i++) { scanf("%d %d", &u, &v); g[u].flip(v); gt[v].flip(u); } kosaraju(); printf("%d\n", ans); } }}
- HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
- HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
- HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- HDU 6070 Dirt Ratio (二分+线段树, 2017 Multi-Univ Training Contest 4)
- HDU 6073 Matching In Multiplication (拓扑+DFS, 2017 Multi-Univ Training Contest 4)
- HDU 6074 Phone Call (LCA+并查集, 2017 Multi-Univ Training Contest 4)
- HDU 6076 Security Check (DP, 2017 Multi-Univ Training Contest 4)
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU 6065 RXD, tree and sequence (LCA, 2017 Multi-Univ Training Contest 3)
- HDU 6046 hash (HASH, 2017 Multi-Univ Training Contest 2)
- HDU 6085 Rikka with Candies (bitset, 2017 Multi-Univ Training Contest 5)
- HDU 6090 Rikka with Graph (贪心+构造, 2017 Multi-Univ Training Contest 5)
- HDU 6086 Rikka with String (AC 自动机+状压 dp, 2017 Multi-Univ Training Contest 5)
- HDU 6093 Rikka with Number (2017 Multi-Univ Training Contest 5)
- HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
- HDU 6127 Hard challenge (极角排序+二分, 2017 Multi-Univ Training Contest 7)
- HDU 6124 Euler theorem (2017 Multi-Univ Training Contest 7)
- 判断一个链表是否有环--剑指offer
- 去除视频广告
- CentOS 6 安装VNC Server实现图形化访问
- memcached安装使用配置
- Java消息队列--ActiveMq简单实例
- HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
- solr6.6.0实时更新mysql数据
- python简单验证码识别
- 【BZOJ 1901】 Zju2112 Dynamic Rankings 主席树+树状数组
- android权限
- 获取最后执行的sql语句,用_sql更方便!
- mysql运算问题
- ArcCatalog 连接远程SDE 连接字符
- android之okhttp