首页 > 其他分享 >C130 并查集 P1197 [JSOI2008] 星球大战

C130 并查集 P1197 [JSOI2008] 星球大战

时间:2024-05-29 11:26:46浏览次数:12  
标签:查集 C130 idx get int JSOI2008 -- include find

视频链接:

 

 

P1197 [JSOI2008] 星球大战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 并查集
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int N=400005;
int h[N],from[N],to[N],ne[N],idx;
void add(int u,int v){
  from[++idx]=u; to[idx]=v;
  ne[idx]=h[u]; h[u]=idx;
}
int n,m,k,x,y,tot;
int a[N],be[N];
int p[N],ans[N];

int find(int x){
  return p[x]==x?x:p[x]=find(p[x]);
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=0;i<n;++i) p[i]=i;
  for(int i=1;i<=m;++i)
    scanf("%d%d",&x,&y),add(x,y),add(y,x);
  scanf("%d",&k);
  for(int i=1;i<=k;i++){
    scanf("%d",&x);
    a[i]=x;  //记录被摧毁的星球
    be[x]=1; //标记x被摧毁
  }
  tot=n-k; //剩余星球独立成块
  for(int i=1;i<=2*m;i++){ //枚举所有边
    //两球都没被摧毁且没在同一集合,则合并
    if(!be[from[i]]&&!be[to[i]]
      &&find(from[i])!=find(to[i])){
      p[find(from[i])]=find(to[i]);
      tot--; //合并后,连通块数-1
    }
  }
  ans[k+1]=tot; //摧毁k个星球后的答案
  for(int j=k;j>=1;j--){ //把摧毁的星球逆向修复
    x=a[j]; be[x]=0;
    tot++; //因为修复一个点,连通块数+1
    for(int i=h[x];i;i=ne[i]){ //枚举x的临接点
      //两球都没被摧毁且没在同一集合,则合并
      if(!be[to[i]]&&find(x)!=find(to[i])){
        p[find(x)]=find(to[i]);
        tot--; //合并后,连通块数-1
      }
    }
    ans[j]=tot; //修复完这个点后,连通块的个数
  }
  for(int i=1;i<=k+1;++i)printf("%d\n",ans[i]);
}

 

信息学奥赛一本通(C++版)1347【例4-8】格子游戏  在线评测系统 (ssoier.cn)

// 并查集判断是否存在环:
// 1.将每个坐标看成一个点值,将所有的坐标横纵坐标都减1,
//   第一个位置即(1,1)看成是0,(1,2)看成是1,依次类推,
//   假设当前点是(x,y),则该点的映射值是a=(x*n+y),
//   若向下画,则b=(x+1)*n+y,若向右画,则b=x*n+y+1
// 2.枚举所有操作,判断a和b是否在同一个集合,
//   若在同一个集合则标记此操作可以让格子形成环
//   若不在同一个集合,则需要将两个集合进行合并
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N=40005;
int n,m;
int p[N];

int get(int x,int y){ 
  return x*n+y;
}
int find(int x){
  return p[x]==x?x:p[x]=find(p[x]);
}
int main(){
  cin>>n>>m;
  for(int i=0;i<n*n;i++) p[i]=i;
  int res=0;
  for(int i=1;i<=m;i++){
    int x,y,a,b; char d;
    cin>>x>>y>>d;
    x--,y--;
    a=get(x,y); //a点
    if(d=='D') b=get(x+1,y); //b点
    else b=get(x,y+1);
    a=find(a),b=find(b);
    if(a==b){ //形成环
      cout<<i; return 0;
    }
    p[a]=b;
  }
  cout<<"draw";
}

 

标签:查集,C130,idx,get,int,JSOI2008,--,include,find
From: https://www.cnblogs.com/dx123/p/18211657

相关文章

  • C129 并查集+01背包 P1455 搭配购买
    视频链接:C129并查集+01背包P1455搭配购买_哔哩哔哩_bilibili  E08【模板】背包DP01背包_哔哩哔哩_bilibiliP1455搭配购买-洛谷|计算机科学教育新生态(luogu.com.cn)//并查集+01背包#include<iostream>#include<cstring>#include<algorithm>usingname......
  • 赛克oj 1540 开心消消乐(并查集、模拟、回溯)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)题目描述近来,小明的班上风靡着一款名为“开心消消乐”的游戏,为了成为大家眼中的超人,小明开始疯狂研究这款游戏的玩法。游戏的场景是一个......
  • 7-4 并查集【模板】
    给出一个并查集,请完成合并和查询操作。输入格式:第一行包含两个整数N、M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数Zi​、Xi​、Yi​。当Zi​=1时,将Xi​与Yi​所在的集合合并。当Zi​=2时,输出Xi​与Yi​是否在同一集合内,是的话输出Y;否则的话输出N。输出格式:......
  • C126 带权并查集 P1196 [NOI2002] 银河英雄传说
    视频链接:   P1196[NOI2002]银河英雄传说-洛谷|计算机科学教育新生态(luogu.com.cn)//带权并查集#include<iostream>usingnamespacestd;constintN=30005;intT;intp[N],d[N],siz[N];intfind(intx){if(p[x]==x)returnx;intt=find(p[x......
  • 【知识点】集合与并查集
    在前几篇文章当中,我们已经讨论了许多有关数论的知识点了,因此Macw决定写几篇数据结构的文章缓一缓。(整天写数论相关的内容容易自闭(bushi))。今天我们将会围绕一个新的数据结构,并查集(DisjointSetUnion)来展开。集合与集合的常见操作在谈论到并查集的时候,首先讨论一个前置知识......
  • C123【模板】扩展域并查集 P1892 [BOI2003] 团伙
    视频链接:C123【模板】扩展域并查集P1892[BOI2003]团伙_哔哩哔哩_bilibili  P1892[BOI2003]团伙-洛谷|计算机科学教育新生态(luogu.com.cn)//扩展域并查集#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,a,b,......
  • 【并查集】冗余连接
    冗余连接如果两个顶点属于相同的连通分量,则说明在遍历到当前的边之前,这两个顶点之间已经连通,因此当前的边导致环出现,为附加的边,将当前的边作为答案返回PythonclassSolution:deffindRedundantConnection(self,edges:List[List[int]])->List[int]:n=len(ed......
  • 【图的连通性】【并查集】【拓扑排序】
    在图论中,不同类型的图(无向图和有向图)需要使用不同的算法和数据结构来处理它们的特性和问题。这里我们将讨论如何使用并查集来解决无向图的连通性问题,以及如何使用深度优先搜索(DFS)、广度优先搜索(BFS)和拓扑排序来解决有向图中的依赖性问题。无向图的连通性:并查集对于无向图的连通......
  • [LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集
    Problem:1584.连接所有点的最小费用目录Kruskal算法复杂度CodePrim算法复杂度CodeKruskal算法复杂度时间复杂度:添加时间复杂度,示例:$O(mlog(m))$空间复杂度:添加空间复杂度,示例:$O(n)$CodeclassSolution{publicintminCostConnectPoints(int[][]po......
  • 并查集
    并查集并查集模板包含路径压缩+小挂大constintMAXN=1e5+1;intfather[MAXN];//存父亲节点father[1]=2指的是1节点的父亲为2intsize[MAXN]; //存每个集合的大小intstack[MAXN];//intn;//建立并查集voidbuild(){ for(inti=0;i<=n;i++)......