**

洛谷oj:P1197星球大战

**

#题目描述

#要用并查集
#这个是要反着用的 比起其他差不多的题有点特殊

#知识点
并查集

#代码
第一次:就按照一般的板子来写超时了 就稍微优化了点 还是超时了
懂了这个再看第二个

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 400005
int bcj[Maxn],exist[Maxn],x[Maxn],y[Maxn],store[Maxn],ans[Maxn];
int n,m,cnt;
int Find(int x)
{if(x != bcj[x]){bcj[x] = Find(bcj[x]);}return bcj[x];
}
void Union(int x,int y)
{int rx = Find(x);int ry = Find(y);if(rx == ry){return ;}else{bcj[rx] = ry;cnt --;//合并就减去1}
}
int main()//还要优化
{cin >> n >> m;memset(ans,0,sizeof(ans));for(int i=0; i<m; i++){cin >> x[i] >> y[i];}//初始化for(int i=0; i<n; i++){bcj[i] = i;exist[i] = 1;//1 表示存在}//int t;cin >> t;for(int i=0; i<t; i++){cin >> store[i];exist[store[i]] = 0;//被毁灭了}//遭到所有摧毁后有多少for(int j=0; j<m; j++){if(exist[x[j]]==1 &&exist[y[j]]==1)//这两个点都存在就可以连接{Union(x[j],y[j]);//连接}}cnt = 0;for(int j=0; j<n; j++){if(bcj[j] == j && exist[j] == 1){cnt++;}}int temp = cnt;//for(int i=t-1; i>=0; i--){exist[store[i]] = 1;//重建了cnt ++;//没有加入联通块中时 自己就是一个联通块 联通块加一 每当加入一个不同联通块时 减一 将两个联通块之间联通了for(int j=0; j<m; j++)//!!! 这一段还要优化  必须要用链表了 不然超时{if(exist[x[j]]==1 &&exist[y[j]]==1&&(store[i] == x[j] || store[i] == y[j]))//这两个点都存在就可以连接 并且要新的点{Union(x[j],y[j]);//连接}}
//        for(int j=0; j<n; j++)
//        {//            if(bcj[j] == j && exist[j] == 1)//有多少个根节点
//            {//                ans[i]++;
//            }
//        }ans[i] = cnt;}for(int i=0; i<t; i++){cout << ans[i] <<endl;}cout << temp <<endl;}

第二次:必须要用到结构体的链表来优化 这个循环里的这段循环

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 400005
int bcj[Maxn],exist[Maxn],store[Maxn],ans[Maxn],PRE[Maxn];
int n,m,cnt,tot;
int Find(int x)
{if(x != bcj[x]){bcj[x] = Find(bcj[x]);}return bcj[x];
}
void Union(int x,int y)
{int rx = Find(x);int ry = Find(y);if(rx == ry){return ;}else{bcj[rx] = ry;cnt --;//合并就减去1}
}
struct Node//tot 链表的自己的下表
{int x;int y;//现在的两个数据int pre;//指向同一个点开始的上一个星球的编号}data[Maxn];void add(int a,int b)//tot 链表的自己的下标 PRE 回溯数组 有上一个编号
{data[++tot].x = a;data[tot].y = b;data[tot].pre = PRE[a];PRE[a] = tot;
}int main()//还要优化
{cin >> n >> m;memset(ans,0,sizeof(ans));memset(PRE,-1,sizeof(PRE));int a,b;for(int i=0; i<m; i++){cin >> a>> b;add(a,b);add(b,a);//!无向图 要绘制两边}//初始化for(int i=0; i<n; i++){bcj[i] = i;exist[i] = 1;//1 表示存在}//int t;cin >> t;for(int i=0; i<t; i++){cin >> store[i];exist[store[i]] = 0;//被毁灭了}//遭到所有摧毁后有多少for(int j=0; j<=(2*m)-1; j++)//!! 0 到2*m -1 是2m个{if(exist[data[j].x]==1 &&exist[data[j].y]==1)//这两个点都存在就可以连接{Union(data[j].x,data[j].y);//连接}}cnt = 0;for(int j=0; j<n; j++){if(bcj[j] == j && exist[j] == 1){cnt++;}}int temp = cnt;//for(int i=t-1; i>=0; i--){exist[store[i]] = 1;//重建了cnt ++;//没有加入联通块中时 自己就是一个联通块 联通块加一 每当加入一个不同联通块时 减一 将两个联通块之间联通了for(int j = PRE[store[i]];j!=-1;j = data[j].pre)//!!! j 是 序号{if(exist[data[j].x] && exist[data[j].y])//都存在{Union(data[j].x,data[j].y);}}ans[i] = cnt;}for(int i=0; i<t; i++){cout << ans[i] <<endl;}cout << temp <<endl;
}

#总结
数据结构平时想不到,就卡死在你最需要的敌方 这个题也太严了 卡死了要用链表的遍历

#洛谷oj:P1197星球大战相关推荐

  1. #洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯

    洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯 #题目描述 #一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱 # ...

  2. 洛谷oj题单【入门2】分支结构-入门难度(Java)

    洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...

  3. 洛谷OJ 入门与面试 B2001-B2148 题解

    洛谷OJ 入门与面试 B2001-B2148 链接:https://pan.baidu.com/s/1cMRv6SBjL_sehYj7oM8gkw 提取码:tel3 B2001 入门测试题目 #inc ...

  4. 洛谷OJ上的A+B花(zhuang)式(bi)解法

    转眼间快到了8月,一想自己都毕业好久了,很怀念曾经在各大OJ上刷题的时光,今天无意在一个算法群里看到最近有个叫洛谷的oj网站貌似蛮火的,于是注册了一个下进去看一看,顺手打开了A+B problem,然 ...

  5. 【洛谷OJ C++】洛谷题单100 入门1顺序结构 题解及学习笔记

    洛谷平台题单100链接:https://www.luogu.com.cn/training/100#problems 目录 学习笔记: P1001 A+B Problem P1000 超级玛丽游戏 P ...

  6. 【洛谷OJ C++】洛谷题单101 入门2分支结构 题解及学习笔记

    洛谷题单101链接:https://www.luogu.com.cn/training/101#problems 笔记及题解目录: 学习笔记: P5710 [深基3.例2]数的性质 P5711 [深基 ...

  7. 洛谷oj P2802 回家(BFS)

    题目链接 简单说下题意,就是给一个迷宫.一开始有6滴血,走一步掉一滴.路上有补血包,问能不能在血量>=1的情况下到达终点. 这题其实就是HDU上面的1072.个人做题习惯搜索题最短路一般用BFS ...

  8. 洛谷OJ素数及其筛法刷题集

    学会了线性筛.快速判断素数的读者可以在OJ上刷这些题了(后续将会完善补充) P3912 素数个数 P1835 素数密度 本题稍有难度,可以结合合数的性质来快速筛除区间内的合数,时间复杂度大致接近于区间 ...

  9. 洛谷OJ:P5960 【模板】差分约束算法

    思路:差分约束模板题,注意使用SPFA来判断负环,也即无解的情况. #include<queue> #include<vector> #include<string> ...

  10. 洛谷OJ U552 守墓人 线段树模板题

    题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...

最新文章

  1. 基于深度学习算法和传统立体匹配算法的双目立体视觉
  2. 非关系型数据库-NoSQL(Redis)
  3. python scale 窗口部件 使用_Tkinter介绍及教学-Python教学【StudyQuant-Python量化投资课堂】...
  4. 模型可解释性技术概览
  5. 如何配置Microsoft LoopBack Adapter 配置为系统的主网络适配器
  6. hbase shell-dml(数据管理指令)
  7. 雨尘SEO静态页面生成系统版本源码3秒钟可生成上千条单页面SEO必备神器
  8. clistctrl获取选中行数据_Power Query基础6:筛选、排序、删重复行
  9. JDK8新特性(十三)之Optional
  10. [SQL实战]之查找employees表
  11. matlab warp,matlab warpimg
  12. helloworld代码_十年架构师教你用最简单的代码实现Java基础编程—Hello World!
  13. linux基本命令之chattr与lsattr
  14. Chinapub要买的书
  15. 浙江丽水龙泉计算机培训,浙江丽水龙泉中等职业学校
  16. 上三角矩阵法Matlab,在MATLAB中重塑/变换上三角矩阵
  17. centos安装bzip2
  18. couchbase java 手册_couchBase在java中使用的基本知识
  19. 打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)...
  20. java中 求余运算 % ,正负号问题

热门文章

  1. 数据结构c语言版第4版答案,严蔚敏版数据结构(C语言版)参考答案第四、五章
  2. TakeColor取色器的使用
  3. C语言 关键字 | typedef
  4. iOS开发常见的宏定义(实用)
  5. C语言实现成语接龙完整版
  6. 中鸣机器人走黑线_乐高机器人三光感走黑线
  7. MyBatis3简介
  8. unity 解决乱码_解决unity3d读写中文乱码
  9. OpenGL超级宝典第五版 Windows + VS2013配置
  10. Lingo 11安装教程