博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
湖南多校对抗赛(2015.05.03)Problem B: War
阅读量:6765 次
发布时间:2019-06-26

本文共 1532 字,大约阅读时间需要 5 分钟。

并查集。从后往前加边。

#include
#include
#include
#include
using namespace std;const int maxn = 1000000 + 10;int father[maxn], u[maxn], v[maxn], Q, q[maxn], ans[maxn], ff[maxn];int find(int x){ if (x != father[x]) father[x] = find(father[x]); return father[x];}int main(){ int n, m, i; while (~scanf("%d%d", &n, &m)) { memset(ff, 0, sizeof(ff)); for (i = 0; i <= n; i++) father[i] = i; for (i = 1; i <= m; i++) scanf("%d%d", &u[i], &v[i]); scanf("%d", &Q); for (i = 1; i <= Q; i++){ scanf("%d", &q[i]); ff[q[i]] = 1; } int tot = n;//没有边的时候有n个集合 for (i = 1; i <= m; i++) { if (ff[i] == 0) { int uf, vf; uf = find(u[i]); vf = find(v[i]); if (vf != uf) { father[vf] = uf; tot--; //加入一条边,集合少一个 } } } ans[1] = tot; int j = 2; for (i = Q; i > 1; i--) { int uf, vf; uf = find(u[q[i]]); vf = find(v[q[i]]); if (vf != uf) { father[vf] = uf; tot--; //加入一条边,集合少一个 } ans[j] = tot; j++; } for (i = Q; i >= 1; i--) { if (i > 1) printf("%d ", ans[i]); else printf("%d\n", ans[i]); } } return 0;}

 

转载于:https://www.cnblogs.com/zufezzt/p/4474148.html

你可能感兴趣的文章
JS按回车键实现登录的方法
查看>>
C#属性访问器
查看>>
eclipse常用快捷键
查看>>
Python学习之==>内置函数、列表生成式、三元表达式
查看>>
【std::regex】C++文件路径正则表达式
查看>>
java实践经验几种常见数据库连接池的使用比较
查看>>
java 获取某个URL的文件扩展名的方法(非精确,精确的扩展名应该使用服务器返回的MIME-TYPE)...
查看>>
BZOJ 4590 [Shoi2015]自动刷题机 ——二分答案
查看>>
吴恩达机器学习笔记16-决策边界(decision boundary)
查看>>
分水岭算法(理论+opencv实现)
查看>>
暑假集训第六周contest1
查看>>
libnl3.2.25安装编译
查看>>
第一天
查看>>
go语言字符串处理
查看>>
hihocoder 1014----Trie树
查看>>
【2016.5.27】再见,软件工程,你好,软件工程。
查看>>
POJ 3237 Tree
查看>>
hdu 2586 How far away ? ( 离线 LCA , tarjan )
查看>>
ISTQB测试人员认证 初级(基础级)大纲
查看>>
核反应堆
查看>>