蓝桥杯每日真题 - 第13天

news/2024/11/16 20:48:39/

题目:(删边问题)

题目描述(14届 C&C++ B组F题)

 

解题思路:

  • 图的构建:使用邻接链表表示图,边的起点和终点分别存储在数组中,以支持高效的遍历。

  • Tarjan算法:利用Tarjan算法找到割边(即桥),判断割边是否会将图分为两个连通分量。

  • 求解最小权值差:对于每条割边,计算割除后的两个连通分量的权值之差。遍历所有割边,求出权值差的最小值。

  • 结果输出:若找不到合法的删除方案(即不存在割边),输出-1;否则,输出最小权值差。

代码实现(C语言):

//建议先去学最短路劲生成(dijskra堆优化)和最小树生成(kruskal)后再来学tarjan算法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//邻接链表
long long weight[200009];//点权
long long sum=0;//边权和
int end=0;
int head[2*200009];//每一个u对应的边的序号
int v[2*200009];//边从u到v
int next[2*200009];//前一个u起头的边//tarjan
int dfn[200009];//节点u搜索的次序编号
int low[200009];//u或者u的子树能追寻的最早的栈中的节点序号
int index=0;//访问点的个数
int mark[200009];//记录该点是否被访问过
long long ans=9999999999;//最小差值int N,M;//N个节点,M个边long long min(long long a,long long b)
{if(a<b) return a;else return b;
}void add(int U,int V)
{//建立邻接链表end++;v[end]=V;next[end]=head[U];head[U]=end;
}void tarjan(int x,int ine)//追寻到点x,访问的路劲的对应边的编号
{dfn[x]=++index;low[x]=index;//遍历x能走的边for(int i=head[x];i;i=next[i]){int t=v[i];if(dfn[t]==0)//mark{//没被访问,向下进行访问,直到把x的强联通图访问完tarjan(t,i);//向下访问后,回溯的时候赋值//min判断交叉时每条路劲的值,从而得到最小值low[x]=min(low[t],low[x]);weight[x]+=weight[t];//联通路劲点权和if(low[t]>dfn[x])//t的分支最终没连上跟{//砍掉t的分支,t分支实现内循环,并找到最小差值ans=min(ans,llabs(sum-2*weight[t]));}}//给每一个联通到跟的点赋值else if(i!=ine-1&&i!=ine+1) low[x]=min(low[x],dfn[t]);}
}
int main(int argc, char *argv[])
{// 请在此输入您的代码scanf("%d%d",&N,&M);for(int i=1;i<=N;i++){scanf("%lld",&weight[i]);sum+=weight[i];}for(int i=1;i<=M;i++){int U,V;scanf("%d%d",&U,&V);add(U,V);add(V,U);}tarjan(1,0);if(weight[1]!=sum)//没有联通 printf("%lld",sum-2*weight[1]);else {if(ans!=9999999999) printf("%lld",ans);else printf("-1");}return 0;
}

代码分析: 

  • 图的构建:使用邻接链表结构存储图,以便高效遍历所有边。

  • Tarjan算法:通过DFS和low数组计算割边。Tarjan算法能够在一次DFS中找到所有割边,效率较高。

  • 最小差值计算:在找到的割边中,计算每条割边将图分成的两个连通分量的权值差,并更新最小差值。

  • 结果输出:若没有找到合法的割边,输出-1,否则输出最小差值。

得到运行结果:

难度分析

⭐️⭐️⭐️⭐️

总结

  • 算法适用于解决无向图中的割边问题,并且能高效计算分割后的连通分量权值差。

  • Tarjan算法在一次深度优先搜索中找出割边,提高了效率,是处理连通分量问题的有效工具。

  • 代码逻辑较为复杂,尤其是在low和dfn数组的更新上,需要对图的割边和强连通分量有较好理解


http://www.ppmy.cn/news/1547539.html

相关文章

SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序

目录 背景 一、LIKE - 模糊查询 1. 通配符 % 2. 占位符 _ 3. 指定集合 [] 3.1 表示否定 ^ 3.2 表示范围 - 4. 否定 NOT 二、DISTINCT - 去重查询 三、HAVING - 过滤查询 四、小的查询设置 1. ASC|DESC - 排序 2. TOP - 限制 3. 子查询 4. not in - 取补集&…

STM32完全学习——F407ZGT6点亮LED

一、寄存器描述 我们想要点亮LED&#xff0c;无非就是对于寄存器的一些设置&#xff0c;主要分为两步&#xff0c;首先是需要打开相应GPIO的时钟&#xff0c;这是因为STM32在上电后&#xff0c;每个外设的时钟默认都是关闭的&#xff0c;需要我们手动打开。其次就是对GPIO的一…

消息中间件分类

消息中间件&#xff08;Message Middleware&#xff09;是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制&#xff0c;允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括&#xff1a; 1. JMS&#xff08;Java Message S…

英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2

我们介绍的 NV-Embed-v2 是一种通用嵌入模型&#xff0c;它在大规模文本嵌入基准&#xff08;MTEB 基准&#xff09;&#xff08;截至 2024 年 8 月 30 日&#xff09;的 56 项文本嵌入任务中以 72.31 的高分排名第一。此外&#xff0c;它还在检索子类别中排名第一&#xff08;…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…

【OceanBase 诊断调优】—— ocp上针对OB租户CPU消耗计算逻辑

指标介绍 租户 CPU 使用量 * 100 / 租户 CPU 分配量。 指标参数说明 指标项指标名称单位租户 CPU 消耗ob_tenant_cpu_percent% 计算表达式 sum(rate(ob_sysstat{stat_id"140013",LABELS}[INTERVAL])) by (GBLABELS) / sum(ob_sysstat{stat_id"140005"…

Wxml2Canvas小程序将dom转为图片,bug总结

1.显示文字 标签上面使用 data-type"text" 加上class名 <view data-type"text" class"my_draw_canvas"><text data-type"text" class"center my_draw_canvas" data-text"企业出游证明">企业出游证明…

JVM——类加载器、类加载器的分类

类加载器是java虚拟机提供给应用程序去 实现获取类和接口字节码数据 的技术 类加载器的分类&#xff1a; 一类是 Java代码中实现的一类是 Java虚拟机底层源代码实现的 通常可以细分为三大类&#xff1a;jdk8版本中的 java代码中的 扩展类加载器&#xff1a;Extension 允许扩…