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

【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路

今天讲最短路统计和分层图

目录

题目:LCA 

思路:

题目:最短路计数

思路:

题目:社交网络

思路:

题目:飞行路线 

思路:

题目:第二短路

思路:


        

        

题目:LCA 

        

思路:

        

非常明显了,之前就说过倍增迭代就是一个一个选区间使总长度达到 M(凑一个数),用不大于它最大的二的次幂,减去之后,再重复这个过程。所以LCA+倍增逼近是最快的。

                

#include<bits/stdc++.h> //最近公共祖先LCA P3379:给一棵数,求任意两点的LCA 
using namespace std;
const int maxn=500002;
int n,m,s,tot=0;
int head[maxn],d[maxn],p[maxn][21];//d存的是深度(deep),p[i][j]存的从i向上走2的j次方那么长的路径到的父节点
struct node{int v,next;}e[maxn*2];//存数要开两倍
void add(int u,int v){e[++tot]={v,head[u]};head[u]=tot;}     void dfs(int u,int fa)// 首先进行的预处理,将所有点的deep和p的初始值dfs出来
{d[u]=d[fa]+1; p[u][0]=fa;  //处理深度,父节点for(int i=1;(1<<i)<=d[u];i++)//i<log(d[u]) 处理每个u的st表p[u][i]=p[p[u][i-1]][i-1];for(int i=head[u];i;i=e[i].next){ //处理u的孩子的st表int v=e[i].v;if(v!=fa) dfs(v,u);//只能向下走,不能向上走}
}                              
int lca(int a,int b) //非常标准的lca查找(两次逼近)
{if(d[a]>d[b]) swap(a,b);   //保证a是在b结点上方(d[b]大)for(int i=20;i>=0;i--){if(d[a]<=d[b]-(1<<i)) b=p[b][i];//向上逼近(b向上移到和a同一个深度)}  if(a==b) return a;  //特判for(int i=20;i>=0;i--){if(p[a][i]==p[b][i]) continue; //向上逼近(A和B一起向上,不断逼近最下端的公共祖先)else a=p[a][i],b=p[b][i];     }return p[a][0];  //找出最后a值的数字
}
int main()
{int a,b;scanf("%d%d%d",&n,&m,&s);//n个结点,m次询问,s是树根编号for(int i=1;i<n;i++){scanf("%d%d",&a,&b);add(a,b); add(b,a); //无向图,要加两次              }dfs(s,0);for(int i=1;i<=m;i++){scanf("%d%d",&a,&b);printf("%d\n",lca(a,b));}return 0;
}

        

         

题目:最短路计数

                  

思路:

        

注意到每条路径的权值都是1,难怪结果会那么大。

        

dikjkstra和spfa版本最短路计数:
1,维护最短路时产生的:那就是映射关系(因为引入的是周围点,相当于ans[v]=ans[cur]*1)
2,新最短路:发现了新的最短路就相加

        
floyd版本最短路计数:
1,维护最短路时产生的:(因为引入的是任意点,故ans[i][j]=ans[i][k]*ans[k][j])
2,新最短路:发现了新的最短路就相加

、        

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=1e6+5,M=2e6+5;
int mod=100003,n,m,tot=0;
int head[N],vis[N],dis[N],ans[N];
priority_queue<pii,vector<pii>,greater<pii>>Q;
struct node {int to;int next;}e[M*2];
void add(int u,int v){e[++tot]=(node){v,head[u]};head[u]=tot;}
void dijkstra(int s){memset(dis,0x3f,sizeof(dis));Q.push({0,s});dis[s]=0;ans[s]=1;while(!Q.empty()){int cur=Q.top().second;Q.pop();if(vis[cur])continue;//跳不跳无所谓,无非耗点时间vis[cur]=1;for(int i=head[cur];i;i=e[i].next){int v=e[i].to;if(dis[cur]+1<dis[v])dis[v]=dis[cur]+1,ans[v]=ans[cur],Q.push({dis[v],v});//映射最短路(路过此点可以变短,那么最短路就和它有关)else if(dis[cur]+1==dis[v])ans[v]+=ans[cur],ans[v]%=mod;//新最短路(发现了另外的最短路就相加)}}
}
int main(){cin>>n>>m;int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}dijkstra(1);//spfa(1);for(int i=1;i<=n;i++){cout<<ans[i]<<'\n';}
}

                 

//spfa版本:这个版本更快!!!!
void spfa(int s){memset(dis,0x3f,sizeof(dis));queue<int>q;vis[s]=1;q.push(s);dis[s]=0;ans[s]=1;while(!q.empty()){int cur=q.front();q.pop();vis[cur]=0;for(int i=head[cur];i;i=e[i].next){int v=e[i].to;if(dis[cur]+1<dis[v]){dis[v]=dis[cur]+1;ans[v]=ans[cur];if(!vis[v])q.push(v),vis[v]=1;	}else if(dis[cur]+1==dis[v])ans[v]+=ans[cur],ans[v]%=mod;}}
}

        

        

题目:社交网络

                

思路:

        

点i的重要程度=∑从s到t的且经过i最短路条数/从s到t的最短路条数(s!=i,t!=i)

主要还是floyd算法,求出每个(i,j)对每个k的重要程度为ans[k]
求到某点时最短路径数:
1,只要最短路更新,那么最短路个数也要更新
2,如果发现了新的最短路,那么就相加
        

#include <bits/stdc++.h>
using namespace std;   
typedef long long ll;
const int N=110;
ll INF,dis[N][N],e[N][N];//e[i][j]表示(i,j)的最短路径数
double ans[N];//每个点的重要程度
int main(){int n,m;ll x,y,z;cin>>n>>m;memset(dis,0x7f,sizeof(dis));INF=dis[1][1];//初始化INF无穷大for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&x,&y,&z);dis[x][y]=dis[y][x]=z;e[x][y]=e[y][x]=1;//初始化e[i][j]}for(int i=1;i<=n;i++)  dis[i][i]=0;//对角线为0,但是不写也对其余任何边都没有影响,写不写随你for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(dis[i][k]==INF||dis[k][j]==INF)continue;//有不通的就直接跳过if(dis[i][j]>dis[i][k]+dis[k][j]){dis[i][j]=dis[i][k]+dis[k][j];//每个边只会更新一次,即当前最优e[i][j]=e[i][k]*e[k][j];//只要最短路更新,则最短路对应的个数也要更新即可continue;}if(dis[i][j]==dis[i][k]+dis[k][j]){//找到了第二条最短路,就相加e[i][j]+=e[i][k]*e[k][j];}}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(i==j||j==k||i==k)continue;if(dis[i][j]==dis[i][k]+dis[k][j])//对k遍历每个(i,j)ans[k]+=(1.0*e[i][k]*e[k][j])/e[i][j];}for(int i=1;i<=n;i++)printf("%0.3f\n",ans[i]);
}

       

         

题目:飞行路线 

        

                 

思路:

        

 一个图中任意两个点都可以权值变成0,最多有k次,我们常常建立k层的分层图,相邻层所有点建立权值为0的立体边,然后跑最短路即可
        

#include <bits/stdc++.h> 
using namespace std;
int cnt,head[110005];
int dis[110005];
bool vis[110005]; //标记当前白点,如果不想用vis,也可以判断取出元素的dis和dis数组中值是否一样
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>> > Q; //堆优化(first是值,second是下标)
struct Edge{ int to,w,next;}e[2500001];
void add(int u,int v,int w) { e[++cnt]=(Edge){v,w,head[u]}; head[u]=cnt;}
void Dijkstra(int s)//dijktra+堆优化
{memset(dis,0x3f,sizeof(dis));dis[s]=0;Q.push(make_pair(0,s));while(!Q.empty())  //必须用empty, size是求大小的,会慢一些 !!!{int u=Q.top().second; Q.pop();if(vis[u]) continue; //已经是白点的就跳过vis[u]=1; //标记成白点for(int i=head[u];i;i=e[i].next){int v=e[i].to,w=e[i].w;if(dis[v]>dis[u]+w) dis[v]=dis[u]+w,Q.push(make_pair(dis[v],v));}}    
}int main()
{int n,m,k,s,t;cin>>n>>m>>k>>s>>t; //城市数,航线数,免费次数,起始城市号,终点城市号int u,v,c;for(int i=0;i<m;++i){cin>>u>>v>>c;//两个城市航线,费用for(int j=0;j<=k;++j){//建立每层图add(u+j*n,v+j*n,c);add(v+j*n,u+j*n,c);if(j!=k){//第k层下面没有了,就别建了add(u+j*n,v+(j+1)*n,0); //分层图:所有相邻层间:上下层u,v的权值为0add(v+j*n,u+(j+1)*n,0);}}}for(int i=1;i<=k;++i){add(t+(i-1)*n,t+i*n,0);}//处理奇葩数据Dijkstra(s);printf("%d",dis[t+k*n]);return 0;
}

         

         

题目:第二短路

                 

思路:

#include<bits/stdc++.h>
using namespace std;   
typedef pair<int,int> pii;
const int N=5005,M=100005;
int n,m,tot,flag;
int head[N],d1[N],d2[N],vis[N];
priority_queue<pii,vector<pii>,greater<pii> > Q;
struct node{int to;int w;int next;}e[M*2];
void add(int u,int v,int w){e[++tot]=(node){v,w,head[u]};head[u]=tot;}
void dijkstra(int s){memset(d1,0x3f,sizeof(d1));//d1存放第一短路memset(d2,0x3f,sizeof(d2));//d2存放第二短路Q.push(make_pair(0,s));d1[s]=0;while(!Q.empty()){int cur=Q.top().second;Q.pop();if(vis[cur])continue;//vis数组可有可无,即便旧白点引入也掀不起变化,无非多走了几步vis[cur]=1;for(int i=head[cur];i;i=e[i].next){int v=e[i].to,w=e[i].w;flag=0;if(d1[cur]+w<d1[v])d2[v]=d1[v],d1[v]=d1[cur]+w,flag=1;//维护最短路,更新前的最短路就是次短路if(d1[cur]+w>d1[v]&&d1[cur]+w<d2[v])d2[v]=d1[cur]+w,flag=1;//最短路没有变化,更新次短路if(d2[cur]+w<d2[v])d2[v]=d2[cur]+w,flag=1;//维护次短路,如果d2[s]初始化成0,那么这个地方就出问题了if(flag)Q.push(make_pair(d1[v],v));}}
}
int main(){cin>>n>>m;int u,v,w;for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dijkstra(1);cout<<d2[n];
}

相关文章:

【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路

今天讲最短路统计和分层图 目录 题目&#xff1a;LCA 思路&#xff1a; 题目&#xff1a;最短路计数 思路&#xff1a; 题目&#xff1a;社交网络 思路&#xff1a; 题目&#xff1a;飞行路线 思路&#xff1a; 题目&#xff1a;第二短路 思路&#xff1a; 题目&a…...

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述&#xff1a; 抗D盾是新一代的智能分布式云接入系统&#xff0c;接入节点采用多机房集群部署模式&#xff0c;隐藏真实服务器IP&#xff0c;类似于网站CDN的节点接入&#xff0c;但是“抗D盾”是比CDN应用范围更广的接入方式&#xff0c;适合任何TCP 端类应用包括&am…...

leetcode算法之位运算

目录 1.判断字符是否唯一2.丢失的数字3.两整数之和4.只出现一次的数字II5.消失的两个数字6.位1的个数7.比特位计数8.汉明距离 1.判断字符是否唯一 判断字符是否唯一 class Solution { public:bool isUnique(string astr) {//利用鸽巢原理做优化if(astr.size()>26) return…...

java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…...

SQL必知会(二)-SQL查询篇(11)-联结表

第12课、联结表 联结表 使用联结&#xff1a;之前的 SELECT 查询某些列&#xff0c;只是针对一张表进行检索的。&#xff08;即 FROM 表名&#xff09;。但是如果用户想要使用 SELECT 对存储在不同表中的某些列时&#xff0c;则需要使用联结表的方式来实现。 例子中有建立两个…...

多模态大一统:开启全模态LLM和通用AI时代的大门

多模态大一统:开启全模态LLM和通用AI时代的大门 1. 目前多模态实现的方法1.1 单独训练各领域模型1.2 多任务学习1.3 集成多模态模型1.4 通用多模态模型2. 多模态统一难点2.1 数据集对齐和融合2.2 大规模计算资源需求2.3 各领域特性的兼容性2.4 可解释性和泛化能力3. 全模态的好…...

Alibaba Nacos注册中心实战

为什么需要注册中心 思考&#xff1a;网络请求&#xff0c;如果服务提供者发生变动&#xff0c;服务调用者如何感知服务提供者的ip和端口变化&#xff1f; // 微服务之间通过RestTemplate调用&#xff0c;ip:port写死&#xff0c;如果ip或者port变化呢&#xff1f; String ur…...

京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜

鲸参谋监测的京东平台10月份冰箱市场销售数据已出炉&#xff01; 10月份&#xff0c;冰箱市场的销售额有小幅上涨。鲸参谋数据显示&#xff0c;在京东平台上&#xff0c;今年10月冰箱市场的销量为94万&#xff0c;销售额将近23亿&#xff0c;同比增长超过1%。从价格上看&#x…...

某事业单位转型二类后绩效项目成功案例纪实

——事业单位从公益一类转向二类之后&#xff0c;如何通过绩效考核提高人员积极性 【客户行业】事业单位 【问题类型】绩效管理 【客户背景】 某国家级博物馆是由当地ZF与自然资源局共建共管的事业单位&#xff0c;是一家综合性较强的博物馆&#xff0c;入选过全国热搜博物…...

MySQL 和 SQL Server之间的数据迁移方法

目录 MySQL导入SQL Server 使用 SQL Server Management Studio (SSMS) 导入导出向导&#xff1a; 使用 SQL Server Integration Services (SSIS)&#xff1a; SQL Server 导入 MySQL 使用 SQL Server Management Studio (SSMS) 导出数据&#xff1a; 使用 MySQL Workbench…...

单元测试实战(五)普通类的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…...

js 迭代器iterator 和 生成器Generator 10

✌ 文章目录 一、迭代器 iterator二、使用步骤1.引入库2.读入数据 总结 一、迭代器 iterator 迭代器是帮助我们对某个数据结构进行遍历的对象 迭代器&#xff1a;是一个对象&#xff0c;帮助我们对某个数据结构进行遍历 迭代器要符合迭代器协议&#xff0c;必须要有一个特定的n…...

100套Axure RP大数据可视化大屏模板及通用组件库

106套Axure RP大数据可视化大屏模板包括了多种实用美观的可视化组件库及行业模板库&#xff0c;行业模板涵盖&#xff1a;金融、教育、医疗、政府、交通、制造等多个行业提供设计参考。 随着大数据的发展&#xff0c;可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再…...

【OpenGauss源码学习 —— 执行算子(Append算子)】

执行算子&#xff08;Append算子&#xff09; Append 算子ExecInitAppend 函数exec_append_initialize_next 函数ExecAppend 函数ExecEndAppend 函数ExecReScanAppend 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和…...

Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)

基本类型和引用类型的参数在传递的时候有什么不同? 基本类型的值传递:参数传输存储的数据值 引用类型的值传递:参数传输存储的地址值 传递数组名字的时候,传递的是数组的地址,change方法可以通过地址直接访问我们在堆内存中开辟的数组,然后改变数组,数组中的元素发生变化 方…...

Vue第1天:特性概览

文章目录 Vue.js 简介 Vue的特性 如何使用Vue 安装Vue 通过CDN引入 使用npm 创建Vue实例 结语 Vue.js 简介 Vue.js&#xff08;通常简称为Vue&#xff09;是一款流行的JavaScript框架&#xff0c;专注于构建用户界面。它的设计灵感来自于现代的JavaScript框架&#xf…...

C++语法基础知识面经汇总

背景&#xff1a;汇总了网上C常考的基础知识&#xff0c;方便复习 1&#xff0c;static关键字 static可以用于成员变量&#xff0c;或者成员函数。存储空间在静态存储区&#xff08;编译器会将其初始化为0&#xff0c;对应的存储空间直到程序执行结束才会释放&#xff09;&…...

AM@幂级数性质@幂级数和函数求解

文章目录 幂级数性质四则运算性质分析性质求解和函数例例 幂级数性质 和多项式有相似的性质本文介绍用幂级数的性质求解幂级数和函数的两个例子 四则运算性质 若幂级数 ∑ n 0 ∞ a n x n \sum_{n0}^{\infin}a_{n}x^{n} ∑n0∞​an​xn(1)的收敛半径为 R 1 R_1 R1​,和函数为…...

PHP低版本安全问题

目录 1、PHP弱类型问题 1.1 MD5、 SHA1 弱比较问题 1.2 数组 0 1&#xff09;函数无法处理数组&#xff0c;返回0 2&#xff09;strcmp 2、特殊字符串导致的问题 2.1 "ffifdyop" 与 md5(string,raw) 2.2 ereg函数漏洞&#xff1a;00 截断 3、正则匹配问…...

结构体——C语言初阶

一.结构体的声明&#xff1a; &#xff08;1&#xff09;结构的基础知识&#xff1a; 结构体是一种构造数据类型把不同类型的数据组合成一个整体结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量需要注意的是&#xff0c;结构体是一种…...

Graphormer部署教程:/etc/supervisor/conf.d/graphormer.conf配置解析

Graphormer部署教程&#xff1a;/etc/supervisor/conf.d/graphormer.conf配置解析 1. 项目介绍 Graphormer是一种基于纯Transformer架构的图神经网络模型&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。该模型在OGB、PCQM4M等…...

Leather Dress Collection 企业级参数调优指南:平衡响应速度与生成质量

Leather Dress Collection 企业级参数调优指南&#xff1a;平衡响应速度与生成质量 如果你正在考虑把Leather Dress Collection这类大模型服务搬到公司的生产环境里&#xff0c;那你肯定遇到过这样的纠结&#xff1a;调快了&#xff0c;生成的内容质量好像会打折扣&#xff1b…...

DynamicColor跨平台开发指南:iOS、macOS、watchOS的统一颜色解决方案

DynamicColor跨平台开发指南&#xff1a;iOS、macOS、watchOS的统一颜色解决方案 【免费下载链接】DynamicColor Yet another extension to manipulate colors easily in Swift and SwiftUI 项目地址: https://gitcode.com/gh_mirrors/dy/DynamicColor DynamicColor是一…...

告别天价桥接芯片!用高云GW5AT-LV15MG132 FPGA搞定MIPI C-PHY摄像头测试盒

国产FPGA革新摄像头测试方案&#xff1a;高云GW5AT-LV15MG132的MIPI C-PHY实战解析 在摄像头模组生产线上&#xff0c;测试环节的成本与效率直接关系到企业竞争力。传统测试方案依赖进口FPGA搭配昂贵桥接芯片&#xff0c;不仅物料清单&#xff08;BOM&#xff09;成本居高不下…...

Qwen3-Reranker-0.6B一文详解:轻量0.6B参数如何实现SOTA级重排序性能

Qwen3-Reranker-0.6B一文详解&#xff1a;轻量0.6B参数如何实现SOTA级重排序性能 1. 引言&#xff1a;为什么你需要关注这个0.6B的小模型&#xff1f; 如果你用过搜索引擎&#xff0c;肯定有过这样的体验&#xff1a;输入一个问题&#xff0c;搜出来一堆结果&#xff0c;但真…...

FunASR Docker部署避坑大全:从SSL证书报错到热词不生效,一次解决所有常见问题

FunASR Docker实战排障指南&#xff1a;从证书配置到热词优化的深度解决方案 当你第一次尝试在Docker环境中部署FunASR语音识别服务时&#xff0c;那些看似简单的命令行参数背后可能藏着无数个"坑"。本文不会重复官方文档的基础操作&#xff0c;而是聚焦于五个最具代…...

别再手动改daemon.json了!1Panel面板里一键配置Docker国内镜像源(附最新可用源列表)

1Panel面板实战&#xff1a;3分钟搞定Docker国内镜像加速配置 刚部署完1Panel的新用户总会遇到一个经典问题——Docker拉取镜像慢得像蜗牛爬。传统解决方案是手动编辑daemon.json文件&#xff0c;但如今有了更优雅的选择。作为一款现代化服务器管理面板&#xff0c;1Panel将复杂…...

STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功

STM32F103红外小车避坑指南&#xff1a;从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时&#xff0c;我花了整整三天时间在Proteus里调试仿真&#xff0c;结果连最基本的电机转动都实现不了。直到把电路搬到实物上&#xff0c;才发现仿真环境里那些看似…...

7个实用技巧:从零开始开发jquery-qrcode自定义二维码生成器

7个实用技巧&#xff1a;从零开始开发jquery-qrcode自定义二维码生成器 【免费下载链接】jquery-qrcode qrcode generation standalone (doesnt depend on external services) 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-qrcode jquery-qrcode是一款轻量级的纯…...

Python入门项目:用10行代码调用MogFace-large实现人脸检测

Python入门项目&#xff1a;用10行代码调用MogFace-large实现人脸检测 想学Python&#xff0c;但觉得枯燥的理论和语法让人昏昏欲睡&#xff1f;今天咱们换个玩法&#xff0c;直接上手一个能“看得见摸得着”的实战项目。想象一下&#xff0c;你只需要写10行左右的代码&#x…...