学习小记----分层图最短路

前置知识

简单的图论知识

简单的dp知识

使用标志

你机智的发现了这是一道图论题,并且出现了类似于N次免费/花费变化的字样,大部分就是分层图最短路了.

它不是不是很难,就是那种,那种看起来很凶神恶煞的,你知道么(好的,我不是专业的但其实挺人畜无害的(flag*1)(也用可能是我做题少

为什么这么做

DP类思路解释:

当你发现传统图论求最短路的方法无法维护有K个变化的时候,你就要想办法通过一些方法,使你的算法可以去多维护一个数据.此时,很顺利利用DP处理后效性的方法之一--加一维,来解决这个方法.把原数组的vis[i]变为vis[i][j],表示你在经过i个点时,你用了j次"免死金牌"的这种状态你是否曾经有过.dis[i]变为dis[i][j],表示你在经过i个点时,你用了j次"免死金牌"时,你所走出的路是怎样的.这时,你再在迪杰斯特拉求解或SPFA求解时,把使用多少次''免死金牌"这种次数记录在堆或队列中即可.

我只写过两次SPFA,所以我就不把SPFA的代码贴上去了,怕出锅

 1 struct ziji{int dis,where,cnt;};
 2 
 3 bool operator < (const ziji &a,const ziji &b){return a.dis>b.dis;}
 4 
 5 priority_queue<ziji>q;
 6 //迪杰斯特拉核心
 7         dis[1][0]=0;q.push((ziji){0,1,0});
 8      //此处不要加vis[1][0]=1,会WA
 9         while(!q.empty()){
10 
11             int which=q.top().where,num=q.top().cnt;q.pop();
12 
13             if(vis[which][num]) continue;vis[which][num]=1;
14 
15             for(int i=head[which];i;i=nxt[i]){
16                 int y=ver[i];
17 
18                 if(num<k&&dis[y][num+1]>dis[which][num]+val[i]/2)
19 
20                     dis[y][num+1]=dis[which][num]+val[i]/2,
21 
22                     q.push((ziji){dis[y][num+1],y,num+1});
23 
24                 if(dis[y][num]>dis[which][num]+val[i])
25 
26                     dis[y][num]=dis[which][num]+val[i],
27 
28                     q.push((ziji){dis[y][num],y,num});
29             }
30         }
31     }

 

构造分层图的思想

每一次你对路径的处理,就相当于改变的图的部分.此时你要尽量维护图不变,所以可以利用主席树不同版本构造的思路来想.就相当于每一次改变路径就来一次"次元飞行",每一个"次元"的图都是相对完整的,每一次你都站在一个"世界线"收束的拐角点,去择优选择你要到哪一个"次元"里去.提前构造出每一个"次元",再跑一遍最短路(没写过QAQ,但在网上找到了一份比较靠谱的代码,我加了点注释贴了上来)

 

 1 for(int i = 1; i <= m; i ++)
 2     {//以bzoj2662冻结为例
 3         int aa,bb,cc;
 4         scanf("%d%d%d",&aa,&bb,&cc);
 5         for(int j = 0; j <= k; j ++)//依据题意建K层
 6         {//每一层的建图操作
 7             build(j*n+aa,j*n+bb,cc);
 8             build(j*n+bb,j*n+aa,cc);
 9             if(j < k)
10             {//如果可以用减速卡的话
11                 build(j*n+aa ,(j+1)*n+bb,cc/2);
12                 build(j*n+bb ,(j+1)*n+aa,cc/2);
13             }
14         }
15     }//剩下的dijkstra正常跑最短路就好
16     dijkstra(1);
17     int ans = 214748364;
18     for(int i = 0; i <= k; i ++)
19         ans = min(ans,dis[i*n+n]);
20     //因为有多层,所以要在多层里求最小值

 

NOTICE  后者对空间要求略大于前者,而前者对时间要求略大于后者,请OIERS依题使用

最后,国际惯例,谢谢大家,有问题欢迎之处一起讨论

 

转载于:https://www.cnblogs.com/fallen-down/p/11210966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号

在SWMM中&#xff0c;管线需要输入上下游节点检查井编号&#xff0c;那么在GIS中可否实现自动获取上下游节点编号呢&#xff1f;思路是这样的&#xff0c;首先获得管线两端节点&#xff0c;然后对端点进行融合&#xff0c;删除重复的节点&#xff0c;最后根据坐标关系分别建立管…

android 设置setmultichoiceitems设置初始化勾选_Linux内核启动:虚拟盘空间设置和内存管理结构初始化...

1. 设置虚拟盘并初始化接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中"虚拟盘使用标志"是否设置&#xff0c; 以此确定系统是否使用了虚拟盘(假设有虚拟盘&#xff0c;大小设置为2 MB)。 操作系统从缓冲区的末端起开辟2MB内存空间设置为虚拟盘&am…

centos7 Failed to start iptables.service: Unit not found

在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理 添加 firewall-cmd --zonepublic --add-port80/tcp --permanent &#xff08;--permanent永久生效&#xff0c;没有此参数重启后失效&#xff09;firewall-cmd --zonepublic --add-port1000-2000/tcp --permanent 重新载…

关闭mysql服务的方法有哪些_MySQL--启动和关闭MySQL服务

介绍了启动服务器的两种方式&#xff0c;以及可能遇到的问题第一种&#xff1a;系统服务1)可以通过右击方式一步步找到服务右击计算机->选择管理->找到服务&#xff0c;然后双击打开&#xff0c;找到mysql&#xff0c;我安装的是mysql8.0所以服务的名称显示是mysql80&…

[浪风分享]很简单的查看电脑所支持的最大内存的方法--磨刀不误砍柴工

硬件操作系统&#xff1d;&#xff1d;&#xff1d;&#xff1d;决定支持的最大内存  在开始&#xff0d;&#xff0d;&#xff0d;运行处输入cmd&#xff08;或者按住winkdyR键输入&#xff23;&#xff2d;&#xff24;&#xff09;&#xff0c;打开命令窗口&#xff0c;输…

mysql mysar_使用mysar分析squid日志(日志存mysql)

需要的包&#xff1a;php5-mysql #安装后php才能联系数据库php5-commonphp5-cli #执行php脚本需要mysql-server开始安装:下载最新的mysar包tar zxvf mysar-2.0.6.tar.gz -C /usr/local-#将mysar解压到/usr/local下ln -s /usr/local/mysar/etc/mysar.apache /etc/apache2/…

mysql语句怎么记_Mysql常用语句(记一下,免得忘)

1、去掉某列记录中的特殊字符例如&#xff1a;/r&#xff0c;update test_table set keyreplace(key, char(13), );其他特殊字符类似。2、查询重复的记录Select weixinid From dianxin_highda_detail Group By weixinid Having Count(*)>1;3、从txt向数据库导入记录load dat…

ZSH终端 乱码问题

参考链接 CSDN 转载于:https://www.cnblogs.com/eat-too-much/p/11216073.html

mysql将数据导入mgr_MySQL 8.0.20 MGR数据迁移过程以及注意事项

1.背景近期由于业务调整&#xff0c;需要将Windows Server 2008 MySQL5.5数据库迁移到Windows Server 2012 MySQL8.0集群MGR中&#xff0c;由于实际部署时&#xff0c;有一台机器硬盘损坏&#xff0c;只能构建双节点MGR&#xff0c;在迁移以及应用迁移过程中遇到许多参数与迁移…

安装 搜狗输入法 ubuntu 18

命令 sudo dpkg -i sogoupinyin_2.2.0.0108_amd64.deb sudo apt --fix-broken install 转载于:https://www.cnblogs.com/eat-too-much/p/11216083.html

devstack mysql_DevStack部署OpenStack开发环境 - 问题总结

建议在使用DevStack搭建OpenStack开发环境前,先安装好开发工具包组.特别是gcc,主要一定是在yum update -y 之前,否则更新完系统后,在安装开发工具包会出现很多依赖包因为版本更新而无法安装.要部署OpenStack需要注意若电脑配置不高,我自己的经验是先最小化或基本Web安装,然后,再…

docker+mysql创建用户名密码_docker构建私有仓库并设置仓库用户和密码

#搭建私有镜像仓库[rootdocker_test opt]# docker pull registryUsing default tag: latestlatest: Pulling from library/registryGet https://registry-1.docker.io/v2/library/registry/manifests/sha256:b1165286043f2745f45ea637873d61939bff6d9a59f76539d6228abf79f87774…

linux 安装RabbitMQ 注意版本

Linux下安装RabbitMQ 一下载依赖包 1.下载Rabbitmq 所依赖的环境gcc、erlang包和rabbitmq包&#xff0c;这里演示是网上下载gcc 依赖 1yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xzerla…

mysql更新写入数据_七、MySQL插入、更新与删除数据

存储在系统中的数据是数据库管理系统(DBMS)的核心&#xff0c;数据库被设计用来管理数据的存储、访问和维护数据的完整性。MySQL中提供丰富的数据管理语句&#xff0c;包括插入数据的INSERT、更新数据的UPDATE以及删除数据的DELETE语句。7.1、插入数据为表的所有字段插入数据使…

mysql语句随机数_程序生成随机数与SQL语句生成随机数

随机数可以通过程序生成&#xff0c;也可以通过SQL语句生成。通过程序生成随机数时一般采用硬件的编号时间作为种子&#xff0c;这种方法在瞬间插入数据库N条数据的时候会影响随机数的效果&#xff0c;生成很多相邻的插入值相同。所以频繁插入时可以使用SQL语句的内置函数生成随…

BPM的四大主要类型

随着网络的发展&#xff0c;移动BPM、社交BPM、云端BPM将顺应市场需求&#xff0c;成为BPM发展的新趋势&#xff0c;最终成为企业即时管控有效工具。BPM将不断促进制造业信息化的转型与发展。所以很少人会否认业务流程管理(BPM)的价值&#xff0c;更不用说给BPM一个全面定义。根…

jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...

我们工程师在设计程序&#xff0c;调试程序&#xff0c;修改程序的时候&#xff0c;为了方便以后对程序的理解&#xff0c;最好是对程序进行注释&#xff0c;能够对程序进行注释也是比较好的一个习惯。为什么这么说呢&#xff1f;因为我们人的脑容量是有限的&#xff0c;或多或…

rpm命令包安装mysql_CentOS7使用rpm包安装mysql 5.7.18

说明本文写于2017-05-20&#xff0c;使用MySQL-5.7.18。操作系统为64位CentOS Linux release 7.2.1511 (Core)&#xff0c;以桌面形式安装。卸载MariaDBCentOS7默认安装MariaDB而不是MySQL&#xff0c;而且yum服务器上也移除了MySQL相关的软件包。因为MariaDB和MySQL可能会冲突…

mysql phpmyadmin远程_phpmyadmin登录远程mysql数据库

之前只用phpmyadmin登录本地的mysql&#xff0c;管理另一个远程数据库的时候发现&#xff0c;单纯用命令行处理字符串、换行符实在是不好使&#xff0c;所以配置了远程登录mysql&#xff0c;很简单的问题结果没有搜到合适的方法&#xff0c;所以记录下我的配置方式。phpmyadmin…

远程创建的git仓库,第一次与本地仓库进行联动,需要强制推送。

简介 远程创建的git仓库&#xff0c;第一次与本地仓库进行联动&#xff0c;需要强制推送。 参考链接 cnblog 转载于:https://www.cnblogs.com/eat-too-much/p/11220873.html