/*思路参考大牛,我脑袋被lv踢了,居然想到用数状数组写。。。思路:并查集,先把不许要删的边用并查集合并,然后把需要删的边逆序加入到并查集中。。。。

My Code:*/

#include <iostream>#include <cstdio>#include <cstring>

using namespace std;

const int N = 100005;

struct node {int s;int e;}g[N];

int parent[N];int c[N];int ans[N];int Rank[N];bool vis[N];

void init(int n) {for(int i = 1; i <= n; i++) {        parent[i] = i;        Rank[i] = 0;        vis[i] = false;    }}

int find(int x) {int k, r, j;    r = x; k = x;while(r != parent[r]) {        r = parent[r];    }while(k != r) {        j = parent[k];        parent[k] = r;        k = j;    }return r;}

void union_set(int x, int y) {    x = find(x);    y = find(y);if(x == y)    return;if(Rank[x] > Rank[y])    parent[y] = x;else {        parent[x] = y;if(Rank[x] == Rank[y])    ++ Rank[y];    }}

int main() {//freopen("data.in", "r", stdin);

int n, m, i, k, cnt;while(~scanf("%d%d", &n, &m)) {        init(n); cnt = 0;for(i = 1; i <= m; i++) {            scanf("%d%d", &g[i].s, &g[i].e);            vis[i] = true;        }

        scanf("%d", &k);for(i = 0; i < k; i++) {            scanf("%d", &c[i]);            vis[c[i]] = false;        }

for(i = 1; i <= m; i++) {if(!vis[i])    continue;if(find(g[i].s) != find(g[i].e)) {                union_set(g[i].s, g[i].e);                cnt++;            }        }

for(i = k-1; i >= 0; i--) {            ans[i] = n-cnt;if(find(g[c[i]].s) != find(g[c[i]].e)) {                union_set(g[c[i]].s, g[c[i]].e);                cnt++;            }        }

for(i = 0; i < k; i++) {            printf("%d", ans[i]);if(i == k-1)    putchar('\n');else    putchar('');        }    }return 0;}

转载于:https://www.cnblogs.com/vongang/archive/2011/11/21/2257632.html

Ural_1671. Anansi's Cobweb(并查集)相关推荐

  1. Ural1671 Anansi's Cobweb 并查集

    倒着来 水题 1671. Anansi's Cobweb Time limit: 1.0 second Memory limit: 64 MB Usatiy-Polosatiy XIII decide ...

  2. URAL 1671 Anansi's Cobweb (并查集)

    一道思维题. 传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20482 题意: 有一张无向图.给Q次删边操作,问每次操 ...

  3. 1671. Anansi's Cobweb(并查集)

    1671 并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出 1 #include <iostream> 2 #include<cstdio> 3 #includ ...

  4. URAL1671 Anansi's Cobweb(离线做 + 并查集)

    传送门 大意:给出一个无向图,删除Q条边,每删除一次就询问一次目前的连通块的数目. 思路:离线搞, 把删边转换为加边,每加一次边,若两个顶点不连通就用并查集把着这两个连通块合并. 代码: #inclu ...

  5. Ural 1671 - Anansi's Cobweb 倒过来做...并查集维护..

    题意: 给出一个无向图..然后不断的删边..问每次删边后..整个图是由几个联通块组成的.... 题解: 以前做过一个题..是CF上面的...是不断的删边..并询问某两点的最短路..当时的方法是倒过来. ...

  6. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  7. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  8. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  9. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

最新文章

  1. AI应届生年薪涨到40万了,你现在转行还来得及!
  2. tcpdump的使用
  3. 【libsvm 错误使用mex】
  4. movzbl和movsbl
  5. python imshow彩色_python中plt.imshow与cv2.imshow显示颜色问题
  6. Win 7 通过事件管理器查看计算机开机关机时间
  7. 速度最快250fps!实时、高性能车道线检测算法LaneATT
  8. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记
  9. 2021最新大厂面试题集锦
  10. 小程序navigator点击有时候会闪一下
  11. linux部署java命令
  12. php7.1.1一键安装/配置文件简单优化
  13. 自动驾驶 2-5 自动驾驶汽车的未来 The Future of Autonomous Vehicles
  14. 控制反转与依赖注入概述——Spring IOC/DI(一)
  15. webservice解析xml文件
  16. 亚特兰蒂斯_亚特兰蒂斯的命运与可下载内容的作用
  17. 共享服务器与独立服务器的区别是什么?
  18. 实现jquery双击图片放大
  19. 圣思园-----Java SE Lesson 7
  20. Revit“原点”、“中心”、“测量点”在哪里?

热门文章

  1. 论文【Learning to Localize Sound Source in Visual Scenes】soundnet的复现
  2. 跨境电商系列 | 防范第三方脚本对数据隐私与安全的侵蚀
  3. HTML标签与CSS样式
  4. 大话赛宁云 | 演系列-超仿真网络空间“演武场”
  5. 会议签到评分系统功能需求2020-5-9
  6. word、ppt文档比较
  7. AtCoder - agc005_b(单调栈)
  8. 多次 ifconfig down 无效的问题
  9. python学习笔记分享(四十)网络爬虫(7)反爬虫问题,解决中文乱码,登陆和验证码处理
  10. 钙通道阻滞剂/拮抗剂的应用