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

国外做宠物产品的网站小说关键词自动生成器

国外做宠物产品的网站,小说关键词自动生成器,网站建设 培训,东莞三合一网站制作文章目录 题目描述基本思路实现代码 题目描述 给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。 最小生成树的概念:给定一张边带权的无向…

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

  • 给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。
  • 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible

最小生成树的概念:给定一张边带权的无向图G=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V|m=|E|。由V中的全部n个顶点和En−1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。

输入格式

  • 第一行包含两个整数nm
  • 接下来m行,每行包含三个整数u,v,w,表示点u和点v之间存在一条权值为w的边。

输出格式

  • 共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible

数据范围

  • 1 ≤ n ≤ 10^5,
  • 1 ≤ m ≤ 2×10^5,
  • 图中涉及边的边权的绝对值均不超过1000

基本思路

  • 读题获得的信息:根据该图的点的个数n和边的条数m的取值范围,可以判定该图是一个稀疏图。
  • 算法的基本流程和时间复杂度
  • Kruskal算法的基本思路其实非常简单。
  • 将无向图中的所有边按照权重从小到大进行排序。这一步骤可以使用时间复杂度较低的排序算法,如快速排序。在C++中,我们可以直接利用<algorithm>头文件中的sort函数来完成排序。值得注意的是,这一步是Kruskal算法的性能瓶颈。当使用快速排序时,其时间复杂度为O(mlogm),其中m是无向图中边的数量。快速排序的常数因子相对于其他同数量级时间复杂度的算法来说较小,因此它具有较好的时间性能,这也使得Kruskal算法在采用快速排序时表现出较高的效率。
  • 创建一个空的集合,用于存储最终的边集。接着,遍历无向图中的每一条边。对于每条边,假设其起点编号为u,终点编号为v,权重为w。如果uv不在同一个连通分量中,则将该边加入到集合中,并将uv视为已连通。这里可以使用并查集这种数据结构来高效地实现这一过程。并查集的两个经典操作是:连接两个元素和判断两个元素是否在同一个连通分量中。由于并查集每次操作的时间复杂度为O(α(n)),其中α是阿克曼函数的反函数,其增长非常缓慢,几乎可以认为是常数时间,因此处理所有边的时间复杂度接近O(m)
  • 综上所述,Kruskal算法的总时间复杂度为O(mlogm + m) = O(mlogm)

实现代码

#include <cstdio>
#include <algorithm>
using namespace std;// 【辅助结构体定义】无向边结构体
struct undirectedEdge
{int u;  // 第一个端点int v;  // 第二个端点int w;  // 边长(权重)
};
// 【辅助常量定义】记录无向图中点个数的上限
const int N = 100010;// 【变量定义】无向图中点的个数和边的条数
int n, m;
// 【变量定义】每一条无向边的起点编号、终点编号和边长(权重)
int u, v, w;
// 【变量定义】记录无向图中每一条无向边的数组
undirectedEdge graph[2 * N];
// 【变量定义】并查集,记录每一个元素所属的集合编号
int p[N];
// 【变量定义】记录最小生成树的权重之和
int result;
// 【变量定义】记录最小生成树中的边的数量
int edgeCount;// 【辅助函数定义】比较无向边的边长的函数(用于后续无向边边长的升序排序)
inline bool CompareByLength(const undirectedEdge& e1, const undirectedEdge& e2)
{return e1.w < e2.w;
}
// 【辅助函数定义】用于查找和修改指定元素所属的集合编号的函数(用于并查集)
int find(int x)
{return x == p[x] ? x : p[x] = find(p[x]);
}int main(void)
{// 【变量输入】输入点的个数和无向边的条数scanf("%d%d", &n, &m);// 【变量输入】输入每一条无向边的起点编号、终点编号和边长(权重)for(int i = 0; i < m; ++ i){scanf("%d%d%d", &u, &v, &w);// 使用预先定义好的向量来存储无向边graph[i] = {u, v, w};}// 【Krustal算法第一步】依据边长从小到大的顺序对无向边进行排序sort(graph, graph + m, CompareByLength);// 【Krustal算法第二步】从小到大遍历无向边向量,找出所有未连通的边,将边的两个端点合并到一个集合中// 将并查集初始化,让每个元素初始所属的集合编号就是其本身的编号for(int i = 1; i <= n; ++ i) p[i] = i;for(int i = 0; i < m; ++ i){// 首先找到u和v两个端点所属的集合int uRoot = find(graph[i].u), vRoot = find(graph[i].v);// 判定无向边的两个端点是否位于同一个集合中(即是否连通),如果不连通则修改为连通,即加入同一个并查集if(uRoot != vRoot){result += graph[i].w;   // 最小生成树权重之和增加++ edgeCount;           // 最小生成树边数增加p[uRoot] = vRoot;       // 修改两个端点之间的连通性}}// 【Krustal算法第三步】判定是否获得了最小生成树if(edgeCount < n - 1) printf("impossible");else printf("%d", result);return 0;
}
http://www.mmbaike.com/news/90243.html

相关文章:

  • b站起飞推广个人网站创建平台
  • 集群注册的公司可以做网站备案黄冈免费网站推广平台汇总
  • 网站请人做的 域名自己注册的 知道网站后台 怎么挂自己的服务器郑州搜索引擎优化
  • 网站建设公司厂西安百度推广代运营
  • 网站建设以什么盈利抖音seo关键词优化排名
  • 提供经营性网站备案百度爱采购推广一个月多少钱
  • 怎么防止网站攻击重庆网站seo好不好
  • 南京建设公司网站百度助手app下载
  • 创口贴设计网站官网百度热门关键词
  • 展示型网站建设方案营销推广ppt
  • 铜川市新区建设局网站百度指数专业版app
  • 建设网站实训报告vivo应用商店
  • 怎么在自己网站上做拼图推广管理
  • 公司开发网站李守洪排名大师怎么样
  • 2014网站设计趋势什么是网络推广工作
  • 王璐 牟平 网站建设东莞新闻头条新闻
  • 公司做网站哪里做深圳网站优化平台
  • 如何伪原创 网站seo入门免费教程
  • 西安做网站朋朋如何搜索网页关键词
  • 桂林漓江景区宝鸡seo优化公司
  • 青岛响应式网站app推广赚佣金
  • 济南市住宅与房地产信息网seo是指什么岗位
  • 天津河东做网站公司成都网站推广公司
  • 无证做音频网站违法吗网站如何推广营销
  • 返利网站建设制作一个简单的html网页
  • 网站开源代码模版关键词推广系统
  • 哈尔滨专业网站建设公司太原关键词优化服务
  • 商务网站建设实训结论seo优化在哪里学
  • 好网站建设公司开发方案对网络推广的理解
  • 富阳区建设工程质监站网站关键词制作软件