洛谷P1197.星球大战

news/2024/9/28 19:04:42 标签: 算法

洛谷P1197.星球大战

  • 并查集 + 贪心

  • 正着不好想,逆向思维将摧毁变为修建

    • 一开始处理图的时候就是将所有没有被炸的点能连的连在一起(图论)
    • 求出连通块数量(并查集)
    • 然后逐步反向将被摧毁的点复原
  •   #include <bits/stdc++.h>
      using namespace std;
      
      const int N = 400010;
      int res;
      int n,m,k;
      int p[N];
      int h[N],e[N],ne[N],s[N],idx;
      bool st[N];
      
      void add(int a,int b)
      {
          e[idx] = b,s[idx] = a,ne[idx] = h[a],h[a] = idx++;
      }
      
      int find(int x)
      {
          if(p[x] != x) return p[x] = find(p[x]);
          return x;
      }
      
      int main()
      {
          //连无向边
          memset(h,-1,sizeof h);
          memset(st,true,sizeof st);
          cin>>n>>m;
          iota(p,p+n+1,0);
          //连无向边
          for(int i=1;i<=m;i++)
          {
              int x,y;
              cin>>x>>y;
              add(x,y),add(y,x);
          }
          cin>>k;
          //pk存被摧毁的星球,ans存答案
          stack<int> pk,ans;
          for(int i=1;i<=k;i++)
          {
              int q;
              cin>>q;
              //标记这个星球被摧毁
              st[q] = false,pk.push(q);
          }
          //无向边 m变成2倍
          // res 为 所有星球独立一共n-k个
          m = 2*m,res = n-k;
          for(int i=1;i<=m;i++)
          {
              //对于每一条边的起点和终点
              int S = find(s[i]),E = find(e[i]);
              //如果都没有被摧毁,并且没有在并查集里连上
              if(st[e[i]] && st[s[i]] && S != E)
              {
                  res --;
                  p[E] = S;
              }
          }
          ans.push(res);
          while(pk.size())
          {
              //取当前tot为修复的星球
              int tot = pk.top();
              pk.pop();
      
              res ++;
              st[tot] = true;
              //tot作为起点的所有边
              for(int i=h[tot];i!=-1;i=ne[i])
              {
                  int j = e[i];
                  int S = find(tot) ,E = find(e[i]);
                  //另一个星球没有被摧毁 连通块--
                  if(st[j] && S != E)
                  {
                      res --;
                      p[E] = S;
                  }
              }
              ans.push(res);
          }
          //逆序输出答案(用栈)
          while(ans.size())
          {
              res = ans.top();
              ans.pop();
              cout<<res<<endl;
          }
          return 0;
      }
    

http://www.niftyadmin.cn/n/5681675.html

相关文章

DarkLabel2.4版本导入MOT17数据集

目录 背景导入效果MOT17数据集说明DarkLabel导入视频导入gt文件 背景 做目标追踪&#xff0c;目前找了一圈开源工具&#xff0c;发现DarkLabel还是很好用的&#xff0c;提供自动目标跟踪&#xff0c;标注很方便。 由于目标追踪我用的是bytetrack&#xff0c;官网是用mot17数据…

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine&#xff08;加载外部的.class文件&#xff0c;redefine到JVM里 &#xff09;举例1&#xff1a;加载新的代码&#xff0c;jad/mc 命令使用举例2&#xff1a;上传 .class 文件到服务器的技巧 二、命令列表 2.…

互联网安全为什么要做风险评估:构建数字世界的坚固防线

在当今这个数字化时代&#xff0c;互联网已经成为社会运转不可或缺的基础设施&#xff0c;它深刻地改变了人们的生活方式、工作模式以及信息交流的渠道。然而&#xff0c;随着互联网的普及和应用范围的扩大&#xff0c;网络安全问题也日益凸显&#xff0c;成为制约互联网健康发…

Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签&#xff1a;trim、where、set、foreach、if、choose、when、otherwise、bind&#xff1b; 1.if 标签 <select id"getUser">select * from User<where><if test" age ! null ">and age > #{age}</if…

Python Web WebAssembly 与 Python 的协同工作

Python Web WebAssembly 与 Python 的协同工作 目录 &#x1f310; WebAssembly&#xff08;Wasm&#xff09;的基础 1.1 什么是 WebAssembly 以及它如何改变 Web 开发1.2 WebAssembly 的性能优势与跨平台特性 &#x1f40d; Python 与 WebAssembly 2.1 在 WebAssembly 中运行…

Hadoop三大组件之MapReduce(一)

Hadoop之MapReduce 1. MapReduce是什么 MapReduce是一个分布式运算程序的编程框架&#xff0c;旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合&#xff0c;形成一个完整的分布式运算程序&#xff0c;并并发运行在一…

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…

快速理解使用mq(二)——用户、虚拟HOST、Queue的创建

一、用户的创建 直接添加即可 二、虚拟Host创建 创建完成选择所属用户 点进去新建的host 管理对应权限 三、queue 创建 选择对应host 直接添加即可