当前位置: 首页 > wzjs >正文

婚纱摄影网站策划书举例一个成功的网络营销案例

婚纱摄影网站策划书,举例一个成功的网络营销案例,wordpress travel,做网站需要写代码双亲表⽰法 接下来要学习到的并查集,本质上就是⽤双亲表⽰法实现的森林。因此,我们先认识⼀下双亲表⽰法。 在学习树这个数据结构的时,讲到树的存储⽅式有很多种:孩⼦表⽰法,双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表…
双亲表⽰法

接下来要学习到的并查集,本质上就是⽤双亲表⽰法实现的森林。因此,我们先认识⼀下双亲表⽰法。
在学习树这个数据结构的时,讲到树的存储⽅式有很多种:孩⼦表⽰法,双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。对⼀棵树⽽⾔,除了根节点外,其余每个结点⼀定有且仅有⼀个双亲,双亲表⽰法就是根据这个特点存储树的,也就是把每个结点的双亲存下来。因此,我们可以采⽤数组来存储每个结点的⽗亲结点的编号,这就实现了双亲表⽰法
![[Pasted image 20250408153417.png]]

但是,在实现并查集的时,我们⼀般让根节点⾃⼰指向⾃⼰。因此,上述存储就变成
![[Pasted image 20250408152922.png]]

并查集的概念

在有些问题中,我们需要维护若⼲个集合,并且基于这些集合要频繁执⾏下⾯的操作:

  • 查询操作:查找元素x属于哪⼀个集合。⼀般会在每个集合中选取⼀个元素作为代表,查询的是这个集合中的代表元素;
  • 合并操作:将元素x所在的集合与元素y所在的集合合并成⼀个集合;(注意,合并的是元素所在的集合,不是这两个元素)
  • 判断操作:判断元素x 和y 是否在同⼀个集合

并查集(UnionFind):是⼀种⽤于维护元素所属集合的数据结构,实现为⼀个森林,其中每棵树表⽰⼀个集合,树中的节点表⽰对应集合中的元素,根节点来代表整个集合
![[Pasted image 20250408155700.png]]

并查集的实现

初始化

初始状态下,所有的元素单独成为⼀个集合:

  • 让元素⾃⼰指向⾃⼰即可
const int N = 1e6 + 10;  
int n;  
int fa[N]; // 双亲表⽰法所需的数组  
// 初始化并查集  
void init()  
{  for(int i = 1; i <= n; i++) fa[i] = i;  
}
查询操作

查询操作是并查集的核⼼操作,其余所有的操作都是基于查询操作实现的!
找到元素x 所属的集合:

  • ⼀直向上找爸爸
// 查询操作  
int find(int x)  
{  if(fa[x] == x) return x;  return find(fa[x]);  // ⼀⾏实现  return fa[x] == x ? x : find(fa[x]);  
}
合并操作

将元素x 所在的集合与元素y 所在的集合合并成⼀个集合:

  • 让元素x 所在树的根节点指向元素y 所在树的根节点。(反过来也是可以的)
// 合并操作  
void un(int x, int y) // 注意,函数名字不能⽤ union,因为它是 C++ 的关键字  
{  int fx = find(x);  int fy = find(y);  fa[fx] = fy;  
}
判断操作

判断元素x 和元素y 是否在同⼀集合:

  • 看看两者所在树的根节点是否相同
// 判断是否在同⼀集合  
bool issame(int x, int y)  
{  return find(x) == find(y);  
}

并查集的优化

极端情况:在合并的过程中,整棵树变成⼀个链表。
路径压缩:在查询时,把被查询的节点到根节点的路径上的所有节点的⽗节点设置为根节点,从⽽减⼩树的深度。也就是说,在向上查询的同时,把在路径上的每个节点都直接连接到根上,以后查询时就能直接查询到根节点

// 找根节点 - 路径压缩  
int find(int x)  
{  if(fa[x] == x) return x;  return fa[x] = find(fa[x]);  // ⼀⾏实现  return fa[x] == x ? x : fa[x] = find(fa[x]);  
}

还有⼀种优化⽅式是按秩合并,但是基本上不⽤按秩合并,并查集的时间复杂度就很优秀了

P3367 【模板】并查集 - 洛谷
#include <bits/stdc++.h>
using namespace std;const int N = 2e5 + 10;int n;
int fa[N];int find(int x)
{if (fa[x] == x) return x;return fa[x] = find(fa[x]);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T;cin >> n >> T;for (int i = 1; i <= n; i++) fa[i] = i;while (T--){int z, x, y; cin >> z >> x >> y;if (z == 1)//合并{int fx = find(x);int fy = find(y);fa[fx] = fy;}else //判断{if (find(x) == find(y)) cout << "Y" << endl;else cout << "N" << endl;}}return 0;
}
P1551 亲戚 - 洛谷

具有亲戚关系的两个集合就合并在⼀个集合中。因此,可以⽤并查集解决

#include <bits/stdc++.h>
using namespace std;const int N = 5010;int n, m, p;
int fa[N];int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}void un(int x, int y)
{int fx = find(x);int fy = find(y);fa[fy] = fx;
}bool issame(int x, int y)
{return find(x) == find(y);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m >> p;//初始化for (int i = 1; i <= n; i++) fa[i] = i;while (m--){int x, y; cin >> x >> y;un(x, y);}while (p--){int x, y; cin >> x >> y;if(issame(x, y)) cout << "Yes\n";else cout << "No\n";}return 0;
}
P1596 [USACO10OCT] Lake Counting S - 洛谷

遍历整个矩阵,每次遇到⼀个⽔坑时,就把这个⽔坑右、下,左下以及右下的⽔坑合并在⼀起。最终判断⼀下⼀共有多少个集合

#include <bits/stdc++.h>
using namespace std;const int N = 110;int n, m;
char a[N][N];
int fa[N * N];int dx[] = {0, 1, 1, 1};
int dy[] = {1, 1, 0, -1};int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}void un(int x, int y)
{fa[find(x)] = find(y);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> a[i][j];        }}for (int i = 0; i < n * m; i++) fa[i] = i;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (a[i][j] == '.') continue;for (int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if (y >= 0 && a[x][y] == 'W'){un(i*m+j, x*m+y);}}}}int ret = 0;for (int i = 0; i < n*m; i++){//判断是不是Wint x = i / m, y = i % m;if (a[x][y] == 'W' && fa[i] == i) ret++;}cout << ret << endl;return 0;
}
P1955 [NOI2015] 程序自动分析 - 洛谷

先利⽤并查集维护所有相等的信息,然后遍历所有的不相等信息,判断⼀下是否合法。
因为数据范围的问题,需要先对所有的数离散化处理
![[Pasted image 20250408171740.png]]

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int n;
struct node
{int x, y, e;
}a[N];//离散化
int pos;
int disc[N * 2];
unordered_map<int, int> mp;//并查集
int fa[N * 2];int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}void un(int x, int y)
{fa[find(x)] = find(y);
}bool issame(int x, int y)
{return find(x) == find(y);
}bool solve()
{cin >> n;//清空数据pos = 0;mp.clear();for (int i = 1; i <= n; i++){cin >> a[i].x >> a[i].y >> a[i].e;disc[++pos] = a[i].x; disc[++pos] = a[i].y;}//离散化sort(disc+1, disc+1+pos);int cnt = 0;for (int i = 1; i <= pos; i++){int x = disc[i];if (mp.count(x)) continue;cnt++;mp[x] = cnt;}//初始化for (int i = 1; i <= cnt; i++) fa[i] = i;//用并查集维护相等的信息for (int i = 1; i <= n; i++){int x = a[i].x, y = a[i].y, e = a[i].e;if (e == 1) un(mp[x], mp[y]);}//判断不等的信息是否合法for (int i = 1; i <= n; i++){int x = a[i].x, y = a[i].y, e = a[i].e;if (e == 0){if (issame(mp[x], mp[y])) return false;}}return true;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T; cin >> T;while (T--){if (solve()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
http://www.dtcms.com/wzjs/277185.html

相关文章:

  • 做网站有意思吗腾讯网网站网址
  • 南京网站建设哪家专业最新seo课程
  • 网站模板加盟代理网络营销
  • b2b网站用户群划分建设网站的步骤
  • 网站建设分解结构推广普通话的文字内容
  • 域名价格查询网站学生个人网页优秀模板
  • 怎么建设淘宝客网站电商怎么注册开店
  • 专门做淘宝优惠券的网站网站搜索引擎优化的步骤
  • 合肥建站公司有哪家招聘的短视频搜索优化
  • 门头沟做网站营业推广方式
  • 百度做玻璃钢的网站百度收录要多久
  • 做平面设计哪个网站下载素材好热门搜索排行榜
  • 外贸网站怎么建设合肥百度推广排名优化
  • 芜湖网站制作搜索引擎优化培训班
  • 设计师找素材的网站百度收录关键词查询
  • 网站开发运营服务合同重庆白云seo整站优化
  • 阿拉伯语言网站建设百度登录入口百度
  • 免费做易拉宝网站培训网站排名
  • 昆明优化网站百度客服投诉中心
  • wordpress主题aware代做seo排名
  • 视频网站发展好应该怎么做色盲眼镜
  • 景区网站策划书网络营销策划书步骤
  • 建个大型网站需杭州优化公司哪家好
  • 成都高端网站建设百度seo新算法
  • wordpress建手机网站软件推广的渠道是哪里找的
  • 企业网站怎么做优化网络热词排行榜
  • 中国建设网上银行苏州seo建站
  • 北流做网站搜索广告优化
  • 石家庄模板自助建站广告软文怎么写
  • 南昌大型网站制作推广公司运营模式