URAL1671 Anansi's Cobweb(离线做 + 并查集)
来源:互联网 发布:android网络培训 编辑:程序博客网 时间:2024/05/21 06:34
传送门
大意:给出一个无向图,删除Q条边,每删除一次就询问一次目前的连通块的数目。
思路:离线搞, 把删边转换为加边,每加一次边,若两个顶点不连通就用并查集把着这两个连通块合并。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 100005using namespace std;int n, m, q;int s[MAXN], t[MAXN];int ban[MAXN], fa[MAXN], st[MAXN];bool f[MAXN], g[MAXN];int rt(int u){ if(fa[u] != u) return fa[u] = rt(fa[u]); return u;}int main(){ while(~scanf("%d%d", &n, &m)) { memset(ban, 0, sizeof ban); memset(fa, 0, sizeof fa); memset(st, 0, sizeof st); memset(f, 0, sizeof f); memset(g, 0, sizeof g); for(int i = 1; i <= m; i ++) scanf("%d%d", &s[i], &t[i]); for(int i = 1; i <= n; i ++) fa[i] = i; scanf("%d", &q); for(int i = 1; i <= q; i ++) { scanf("%d", ban + i); f[ban[i]] = 1; } int ans = n; for(int i = 1; i <= m; i ++) if(!f[i]) { int t1 = rt(s[i]), t2 = rt(t[i]); if(t1 != t2) fa[t1] = t2, ans --; } for(int i = q; i > 0; i --) { st[i] = ans; int t1 = rt(s[ban[i]]), t2 = rt(t[ban[i]]); if(t1 != t2) fa[t1] = t2, ans --; } printf("%d", st[1]); for(int i = 2; i <= q; i ++) printf(" %d", st[i]); putchar('\n'); } return 0;}
0 0
- URAL1671 Anansi's Cobweb(离线做 + 并查集)
- Ural 1671 - Anansi's Cobweb 倒过来做...并查集维护..
- Ural 1671. Anansi's Cobweb(并查集)
- URAL 1671 Anansi's Cobweb (并查集)
- Ural 1671. Anansi's Cobweb(并查集)
- ural 1671 Anansi's Cobweb-并查集
- Ural 1671. Anansi's Cobweb
- Ural 1671 Anansi's Cobweb
- Ural 1671 Anansi's Cobweb
- 离线的并查集
- 离线+并查集 Portal
- HDU 3938 离线并查集
- hdu 3938(离线并查集)
- LCA Tarjin 并查集 离线
- hdu 3938(离线的并查集)
- HRBUST 1793 离线并查集
- hdu3938(并查集+离线)
- hdu3938 并查集+离线化
- Android LaunchMode的详解
- C++引用详解
- linuix 添加、删除用户
- hdu——Red and Black
- 最小生成树之kruskal算法
- URAL1671 Anansi's Cobweb(离线做 + 并查集)
- android studio 使用AIDL实现IPC
- iOS Auto Layout学习
- 1021. 个位数统计 (15)
- HDU 3488 Tour 最大权匹配
- 文章标题
- 高斯消元模版
- Iterator理解
- HDU5383 不需要满流的费用流 网络流