目录

  • A、AcWing 1250. 格子游戏
  • B、AcWing 1252. 搭配购买
  • C、AcWing 237. 程序自动分析
  • D、AcWing 239. 奇偶游戏
  • E、AcWing 238. 银河英雄传说(边带权并查集)

A、AcWing 1250. 格子游戏


并查集解决的是连通性(无向图联通分量)和传递性(家谱关系)问题,并且可以动态的维护。抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以将点分为若干个集合,每个集合对应图中的一个连通块。

#include<bits/stdc++.h>using namespace std;
const int N = 500007;int n, m;
int fa[N];
bool flag;int get(int x, int y){return x * n + y;
}int find(int x){if(fa[x] == x)return x;return fa[x] = find(fa[x]);
}int main(){scanf("%d%d", &n, &m);int res;for(int i = 1;i <= n * n ; ++ i)fa[i] = i;for(int i = 1;i <= m; ++ i){int x, y, a, b;char op[2];scanf("%d%d%s", &x, &y, op);x -- , y -- ;a = get(x, y);if(*op == 'D')b = get(x + 1, y);else b = get(x, y + 1);int aa = find(a), bb = find(b);if(aa == bb && !flag){res = i;flag = true;}fa[aa] = bb;}if(res)printf("%d\n", res);else puts("draw");return 0;
}

B、AcWing 1252. 搭配购买

并查集缩点+01背包

可以利用并查集,将这m组配对购买的商品划到一个集合里,这样就可以确定买了其中一个就得买另一个。

//并查集没有办法通过一个点直接找到所有的该集合的点,但是这里我们可以O(n)把属于同一个集合的点缩点,缩成一个物品然后裸一个01背包#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 50007;int n, m, k;
int fa[N];
int a[N], b[N];
int c[N], w[N];
int f[N];int find(int x){if(x == fa[x])return x;return fa[x] = find(fa[x]);
}int main(){scanf("%d%d%d", &n, &m, &k);for(int i = 1;i <= n; ++ i)scanf("%d%d", &c[i], &w[i]);for(int i = 1;i <= n; ++ i)fa[i] = i;for(int i = 1;i <= m; ++ i){int x, y;scanf("%d%d", &x, &y);int fx = find(x), fy = find(y);if(fx != fy){fa[fx] = fy;c[fy] += c[fx];w[fy] += w[fx];}}for(int i = 1;i <= n; ++ i)for(int j = k; j >= c[i]; -- j){if(fa[i] == i)f[j] = max(f[j], f[j - c[i]] + w[i]);}printf("%d\n", f[k]);return  0;
}

也可以用tarjan缩点+背包

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int money[maxn],fa[maxn];
int c[maxn],d[maxn];
int head[maxn],next[maxn],to[maxn],cnt=0;
int add(int x,int y)
{to[++cnt]=y;next[cnt]=head[x];head[x]=cnt;
}
int dfn[maxn],low[maxn],sum=0;
int st[maxn],top=0;
int col=0,co[maxn];
int a[maxn],b[maxn];
int dp[maxn];
void tarjan(int node)
{dfn[node]=low[node]=++sum;st[++top]=node;for(int i=head[node];i;i=next[i]){int y=to[i];if(!dfn[y]){tarjan(y);low[node]=min(low[node],dfn[y]);}if(!co[y]){low[node]=min(low[node],low[y]);}}if(dfn[node]==low[node]){col++;while(st[top]!=node){a[col]+=c[st[top]];b[col]+=d[st[top]];co[st[top]]=col;top--;}a[col]+=c[st[top]];b[col]+=d[st[top]];co[st[top]]=col;top--;}
}
int main()
{int n,m,s;scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n;i++){scanf("%d%d",&c[i],&d[i]);}for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}for(int i=1;i<=col;i++){for(int j=s;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+b[i]);}}printf("%d\n",dp[s]);return 0;
}

C、AcWing 237. 程序自动分析

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>using namespace std;const int N = 1000007;struct node{int x, y, z;bool operator<(const node &t)const {return z > t.z;}
}a[N];
int fa[N];
int n, m;
int b[N << 2];int find(int x){if(x == fa[x])return x;return fa[x] = find(fa[x]);
}void merge(int x, int y){x = find(x), y = find(y);fa[x] = y;
}int main(){int t;scanf("%d", &t);while(t -- ){scanf("%d", &n);memset(b, 0, sizeof b);memset(a, 0, sizeof a);memset(fa, 0, sizeof fa);bool flag = 0;int cnt = 0;for(int i = 1; i <= n; ++ i){scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);b[cnt ++ ] = a[i].x;b[cnt ++ ] = a[i].y;}sort(b, b + cnt);int res = unique(b, b + cnt) - b;for(int i = 1;i <= n; ++ i){a[i].x = lower_bound(b, b + res, a[i].x) - b;a[i].y = lower_bound(b, b + res, a[i].y) - b;}for(int i = 1; i <= res; ++ i)fa[i] = i;sort(a + 1, a + 1 + n);for(int i = 1; i <= n; ++ i){int x = a[i].x, y = a[i].y;if(a[i].z){merge(x, y);}else {if(find(x) == find(y)){puts("NO");flag = 1;break;}}}if(!flag)puts("YES");}return 0;
}

D、AcWing 239. 奇偶游戏

E、AcWing 238. 银河英雄传说(边带权并查集)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 300007;
int n, m;
int fa[N];
int a[N];
int sizes[N];
int d[N];//数组d存的是到根节点的距离int find(int x){if(fa[x] == x)return x;int root = find(fa[x]);//先处理之前的根节点到当前根节点的距离d[fa[x]]d[x] += d[fa[x]];//再更新当前x的距离d[x]return fa[x] = root;
}void merge(int x, int y){x = find(x), y = find(y);fa[x] = y;d[x] = sizes[y];sizes[y] += sizes[x];
}
int t;
int main(){ios::sync_with_stdio(false);//这两句不能和scanf同时存在否则会REcin.tie(0);//scanf("%d", &t);cin >> t;for(int i = 1; i <= 30000; ++ i)fa[i] = i, sizes[i] = 1;for(int i = 1, x, y; i <= t; ++ i){char op;cin >> op >> x >> y;if(op == 'M'){merge(x, y);}else {if(find(x) == find(y))printf("%d\n", abs(d[y] - d[x]) - 1);else puts("-1");}}return 0;
}

【高级数据结构】并查集相关推荐

  1. 高级数据结构---并查集

    高级数据结构-并查集 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 int father ...

  2. 【总结】C++ 高级数据结构 —— 并查集用法详解

    文章目录 一.并查集的介绍 二.并查集的基本操作 一.并查集的介绍 并查集(union_find sets)是一种维护集合的数据结构,它的名字中"并""查"&q ...

  3. (转载)一种简单而有趣的数据结构——并查集

    一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...

  4. 一种简单而有趣的数据结构——并查集

    一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...

  5. 数据结构---并查集

    并查集,顾名思义,合并 查找 集合: 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 对于概念等等的这里不再赘述,直接讲解 ...

  6. 算法与数据结构——并查集

    文章推荐:[算法与数据结构]-- 并查集 例子: 数据结构--最小生成树之克鲁斯卡尔算法(Kruskal) 1.2 并查集思想(重点) 我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点 ...

  7. 【常用数据结构——并查集(又在乱牵线了)】

    并查集 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题 ...

  8. 第三十一篇 玩转数据结构——并查集(Union Find)

    1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现 2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两个数 ...

  9. 算法高级部分--并查集

    并查集 1.并查集是什么? 2.算法步骤代码 2.1 初始化 2.2 查找祖宗并统一祖宗 2.3合并操作 3.经典例题 1.并查集是什么? 用一个例子来说明... 江湖不是打打杀杀,是人情世故.在一个 ...

  10. AcWing提高算法课Level-3 第四章 高级数据结构

    AcWing提高算法课Level-3 第四章 高级数据结构 并查集 AcWing 1250. 格子游戏1167人打卡 AcWing 1252. 搭配购买1064人打卡 AcWing 237. 程序自动 ...

最新文章

  1. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面
  2. LNMT部署详细步骤并实现动静分离和负载均衡
  3. (转载)Python数据分析之pandas学习
  4. 20应用统计考研复试要点(part5)--统计学
  5. 程序员加班很严重吗?看看国外程序员怎么怼老板!
  6. (59)FPGA面试题-什么是有限的状态机?有限状态机可分为几类,分别是什么?
  7. python 安装第三方库/包(命令/详细注释),如安装pyinstaller库
  8. cookie token 了解一下
  9. 摩尔条纹拯救我的3D检测
  10. 电脑连接热点无internet访问权限_电脑连接手机热点无法上网的三种解决方法
  11. 「论文阅读」Rethinking Network Design and Local Geometry in Point Cloud:A Simple Residual MLP Framework
  12. vue ssr之nuxt
  13. 柿子营养丰富 吃柿子的几点注意
  14. 扔掉塑料手环吧!有多高科技不重要,美才是重点
  15. c语言 simon 游戏,终于发现少儿英语游戏SimonSays(西蒙说)
  16. aho-corasick php,更快的Aho-Corasick PHP实现
  17. Ubuntu系统进行复制粘贴文件显示没有权限的解决办法
  18. Arduino ESP32 第三方库读取SD卡信息(三)
  19. 【MATLAB】基本数学操作
  20. 新世纪福音战士剧场版(EVA破)蓝光BD高清下载

热门文章

  1. 技巧 | OpenCV程序执行时间计算
  2. 这三所985,博士生毕业,不再要求发表论文!
  3. 爱送礼成中国好前任,谢谢你让我认识了快递员
  4. 第三单元man指令的简单运用
  5. 标准化是RFID发展的必由之路
  6. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
  7. 使用ssh连接gitHub
  8. Jquery怎么比较日期大小?
  9. 20+个可重复使用的jQuery代码片段
  10. android ExpandableListView