竞赛
考级
求求了,你们就加下团队吧!(链接:https://www.acgo.cn/team/1894657430811287552) 如果你们不想加,可以看下这个团队的好处: 1.公告栏很丰富,比如说竞赛新闻,团队成长史,学分公布栏,校规和月刊。 2.题库的题很多,有抽奖和每日一题。 3.题单很丰富,里面有升职题单和每周题单。 4.竞赛很多,至少每周举办一场赛事。 5.文件有趣,其中包括团队头像和有趣图片。
本来想问一下姓艾名哎的“入”迪杰斯特拉算法(AC君爆肝ING),结果…… 我看不懂了,各位大佬看吧QAQ 迪杰斯特拉算法:从原理到 C++ 实战,掌握单源最短路径求解 迪杰斯特拉(Dijkstra)算法是图论领域解决单源最短路径问题的经典贪心算法,由荷兰计算机科学家艾兹赫尔・迪杰斯特拉于 1956 年提出。该算法适用于带非负权边的有向 / 无向图,能高效求解从单个起点到所有其他顶点的最短路径,广泛应用于地图导航、网络路由规划、资源调度等场景。本文将从核心原理出发,结合 C++ 代码实现,全方位讲解迪杰斯特拉算法。 一、算法核心原理 迪杰斯特拉算法的核心是 “贪心策略 + 松弛操作”,通过逐步锁定起点到各顶点的最短路径,最终得到全局最优解。具体步骤如下:1. 初始化定义距离数组dist[],dist[v]表示起点到顶点v的当前最短距离,初始时起点dist[start] = 0,其余顶点dist[v] = ∞(无穷大)。定义布尔数组visited[],标记顶点是否已确定最短路径,初始时所有顶点visited[v] = false。使用优先队列(小根堆)存储待处理的顶点(以 “当前最短距离 - 顶点编号” 的形式),初始时将起点(0, start)入队。2. 贪心选择每次从优先队列中取出当前距离起点最近的顶点 u(小根堆顶元素),若u已确定最短路径(visited[u] = true),则跳过;否则标记u为已确定(visited[u] = true)。3. 松弛操作遍历顶点u的所有邻接顶点v,计算 “起点→u→v” 的路径长度(dist[u] + weight(u, v))。若该长度小于dist[v],则更新dist[v]为该值,并将(dist[v], v)入队(即使v已入队,重复入队不影响,后续处理时会跳过已确定的顶点)。4. 终止条件当优先队列为空时,所有顶点的最短路径均已确定,算法结束。 二、算法关键特性权值限制: 必须保证所有边的权重非负,否则松弛操作无法保证后续不会出现更短路径(负权边场景需使用贝尔曼 - 福特算法或 SPFA 算法)。时间复杂度:邻接矩阵存储图:(O(n^2))(n为顶点数),每次遍历所有未确定顶点。邻接表 + 优先队列(二叉堆):(O((n+e)logn))(e为边数),每个顶点和边最多处理一次,堆操作耗时logn。适用场景:单源最短路径(单个起点,多终点),支持有向图和无向图(无向图可视为双向有向图)。 三、C++ 代码实现(邻接表 + 优先队列版) 1. 代码框架采用邻接表存储图(空间效率更高,适合稀疏图),优先队列使用 C++ STL 的priority_queue(默认大根堆,需自定义比较规则改为小根堆)。 2. 代码说明 数据结构: Edge结构体:存储邻接顶点和边的权重,用于构建邻接表。 PII(pair<int, int>):优先队列的元素类型,第一个值为当前最短距离,第二个值为顶点编号。 邻接表adj[]:adj[u]存储顶点u的所有出边。 核心函数dijkstra(): 初始化距离数组和标记数组,将起点入队。 循环取出优先队列的堆顶元素,跳过已确定的顶点,遍历邻接边执行松弛操作。 松弛操作中,若更新了顶点v的最短距离,则将新的距离和顶点入队。 主函数: 读取输入(顶点数、边数、起点,以及各条边的信息)。 调用dijkstra()算法,输出起点到所有顶点的最短距离。 3. 测试用例 输入示例(有向图): 顶点说明:顶点 1 为起点,边 1→2(权重 2)、1→3(权重 5)、2→3(权重 1)、2→4(权重 3)、3→4(权重 2)。 输出结果: 结果分析:起点 1 到顶点 2 的最短距离为 2(1→2)。起点 1 到顶点 3 的最短距离为 3(1→2→3)。起点 1 到顶点 4 的最短距离为 5(1→2→4 或 1→2→3→4)。 四、常见误区与注意事项负权边问题: 迪杰斯特拉算法无法处理负权边。例如,若存在边 3→2(权重 - 5),则算法会错误地认为顶点 3 的最短距离为 5,而实际 1→3→2 的距离为 0,导致结果偏差。优先队列重复元素:优先队列中可能存在同一顶点的多个距离记录,无需额外删除旧记录,只需在取出时判断visited[u],跳过已确定的顶点即可(重复记录不影响最终结果,仅增加少量堆操作)。顶点编号范围:代码中顶点编号从 1 开始(符合常规输入习惯),若需从 0 开始,只需调整main函数中的输入和输出循环。无穷大取值:代码中使用INT_MAX(int类型的最大值)表示无穷大,需注意路径长度溢出问题(若边权较大,可改用long long类型存储距离)。 五、扩展优化斐波那契堆优化: 理论上可将时间复杂度降至(O(nlogn + e)),但斐波那契堆实现复杂,实际工程中极少使用。双向迪杰斯特拉:同时从起点和终点出发执行贪心策略,相遇时停止,可减少堆操作次数,适合求解两点间的最短路径。处理无向图:只需在添加边时,同时添加u→v和v→u两条边(代码中注释部分)。 总结 迪杰斯特拉算法是单源最短路径问题的核心解法,其贪心策略保证了在非负权边场景下的正确性和高效性。本文通过原理讲解、C++ 代码实现和测试用例,完整呈现了算法的应用过程。掌握该算法不仅能解决图论基础问题,也能为复杂场景(如带约束的路径规划)提供思路。在实际开发中,需根据图的稀疏程度选择邻接矩阵或邻接表存储,并注意避开负权边、重复入队等常见误区。
https://www.acgo.cn/team/1954136972457275392(
在搞之前,请先安装Sympy,如果没有安装,请在cmd里用以下命令安装: 好,安装好以后就可以开始了 先导入相关的模块 接下来是符号部分 准备妥当以后来解方程 这里给大家搞一个测试 请输入方程:8x3+10x2+100x+8=0 x=-575/(144*(3511/1728 + √(156201)/48)^(1/3)) - 5/12 + (3511/1728 + √(156201)/48)^(1/3) 不过有一个小问题,就是如果输入恒等式的话会显示“没有实数解!”
版本:X1.0&X1.1 > 特别鸣谢:@我爱死机 协助开发、规划与提供框架 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 语法讲解 XPR 功能 用于输出整数、浮点数、字符、字符串与布尔类型的数据 格式 数据类型对照表 数据类型代码 数据类型 i 整数 f 浮点数 c 字符 s 字符串 b 布尔 示例 代码: 运行结果: WAIT 功能 等待指定时间,单位:秒 格式 注意,参数[秒数]大于等于0 示例 代码: 运行结果: 等待一秒 CLEAR 功能 清屏 格式 示例 代码: 运行结果: 清屏 ENDL 功能 换行 格式 示例 代码: 运行结果: 换行
我和“吴陈😊”的小伙伴都在ACGO等你,快用这个专属链接加入我们吧!https://www.acgo.cn/application/1981630197495148544
感觉自己无限的付出 没结果 也没回报,我想也没必要了,身边的朋友可惜从来没把我当朋友,倒不如和谁都一样关系不远不近........
链接:https://www.acgo.cn/contest/detail/14909matchRoundId=14909&examId=74564&openLevel=2&teamCode=1951470069377384448 点击链接或者图片参加吧!球球啦!!!
各位入侵acgo的三角洲小朋友们你们的扶贫梦该醒了 以下全有的自觉删号或是金盆洗手谢谢: 1 爱用唐人鼠鼠,耄耋头像,且尤其钟爱"教主"等字眼 2 叫错干员名字(例:哈吉蜂,卫龙,路娜等) 3 叫错红名字(例:心肺复苏机,麦小圈等) 4 喜欢扶贫主播,并试图给团员扶贫(此条可有可无) 5 抄题解大王,时空双修都是拿ai刷的 百无忌吧,南无啊马特拉斯,破防骂我替我挡灾
我和“咚咚🐏”的小伙伴都在ACGO等你,快用这个专属链接加入我们吧!https://www.acgo.cn/application/1881240671421403136
卡特兰数一个通项式: H(n)=(4n−2)/(n+1)∗H(n−1)H(n)=(4n-2)/(n+1)*H(n-1)H(n)=(4n−2)/(n+1)∗H(n−1) 斯特林数: S(i,j)=j∗S(i−1,j)+S(i−1,j−1)S(i,j)=j*S(i-1,j)+S(i-1,j-1)S(i,j)=j∗S(i−1,j)+S(i−1,j−1)
我是:主播贝利亚本人
题目描述 期末考试共两科,语文和数学,已知班上所有同学的语文分和数学分,请帮助求出每个人的期末分。 提示 1≤n≤50,每科成绩不超过 100 分,且不低于 0 分的整数。 样例解释: 第一个学生的语文 100,数学 100,期末总分 200 分。 第二个学生的语文 88,数学 75,期末总分 163 分。 第三个学生的语文 91,数学 85,期末总分 176 分。 输入格式 共三行,第一行一个整数 n, 表示学生人数。 第二行是每个人的语文成绩,分别用空格间隔的 n 个学生成绩。 第三行是每个人的数学成绩,分别用空格间隔的 n 个学生成绩。 输出格式 输出一行用空格间隔的 n 个学生的期末总分。 样例组输入#1 3 100 88 91 100 75 85 样例组输出#1 200 163 176 求题解!
🌟 C++ 二维数组小笔记 一、什么是数组?🤔 数组就像一个盒子排成的一排, 每个盒子里可以放一个数字。 例如: 这是一个一维数组(只有一排)。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 二、什么是二维数组?📦📦 二维数组就像一个表格, 有行,也有列。 📊 就像教室里的座位表: 第1列 第2列 第3列 1 2 3 4 5 6 这个表格就是一个二维数组! ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 三、二维数组长什么样?👀 在 C++ 里,二维数组这样写: 意思是: * 2 行 * 3 列 👉 一共 2 × 3 = 6 个小格子 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 四、给二维数组装数字 🎁 我们可以一次性放进去: 可以想成: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 五、怎么拿出里面的数字?🔍 规则是: ⚠️ 注意:行和列都是从 0 开始的! 例子: 就像这样: 行\列 0 1 2 0 1 2 3 1 4 5 6 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 六、用循环把二维数组全部看一遍 🔄 我们可以用两个 for 循环: 🖨 输出结果:
啊啊啊啊啊啊
> 链表(数组) 一:输入 1. {0号节点1号节点2号节点3号节点\begin{cases} 0号节点\\ 1号节点\\ 2号节点\\ 3号节点\\ \end{cases} ⎩⎨⎧ 0号节点1号节点2号节点3号节点 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 2.两个数存储链表的信息 1.DATE[I]:第I号的值(=3); 2.NEXT[I]:第I号的下一项; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 3.HEAD->头节点 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 二:例子 节点编号 data[i] next[i] 含义 0 0 -1 值是0,下一个是空 1 10 2 值是10,下一个是2 2 20 4 值是20,下一个是4 3 30 0 值是30,下一个是0 4 40 3 值是40,下一个是3 HEAD: 1−−−>2−−−>4−−−>3−−−>0−−−>NULL;1--->2--->4--->3--->0--->NULL; 1−−−>2−−−>4−−−>3−−−>0−−−>NULL; 10−−−−20−−−−40−−−−30−−−−0−−−NULL;10----20 ----40 ---- 30 ----0---NULL; 10−−−−20−−−−40−−−−30−−−−0−−−NULL; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 三:题目
共23107条