题意:给定一个T条边的无向图,求S到E恰好经过N条边的最短路径 T≤100 N≤1000000

分析:(据说好像假期学长讲过)

首先很容易想到的是dp[i][j][k]表示从i到j经过k条边的最短路径

显然是会mle以及t的

不过不妨碍我们yy一下这种错误的做法

dp[i][j][k]=min(dp[i][j][k],dp[i][p][k-1]+mapp[p][j]) 其中p是枚举的中间点,mapp是直接连接i与j的边的长度

也就是说i->j走k条边的路径可以转化为i->p走k-1条边再从p走到j的路径

k只与k-1相关,所以可以消一维

也就是dp'[i][j]=max(dp[i][p]+mapp[p][j])

但即便是这样,显然时间也不够,

我们先回到原来的dp[i][j][k]

其实dp[i][j][k]并不是非要从dp[i][j][k-1]转移过来

他其实也可以从dp[i][j][k/2]转移过来

比如dp[i][j][k]=min(dp[i][j][k],dp[i][p][k/2]+dp[p][j][k/2])

当然这里的k/2也可以从k/4转移......

发现没,这是不是只需要用二进制给n拆分一下,再求出每个位数的dp矩阵就行了

这是不是又像极了矩阵快速幂(有没有回忆起假期讲的东西(反正我是没有))

所以只需要用矩阵快速幂即可,只不过把原来行列式的计算改成类似floyd罢了

这题到这里也基本结......

等等,咱dp数组还开不下呢

其实根本没必要开k那维,显然问这个问题还是矩阵快速幂没学好(好像是我自己问的)

现在才是差不多结束了

当然还是有几个细节

比如这里题目的点号范围给的是1e3,但一共才100条边,所以用个map即可,点数最多200个

还有,dp[i][j][1](当然这里并没有1这维,只是为了方便表达)是什么

就是mapp呗

但注意,这里i到i并不是0,而是inf(不存在)

因为这个dp的定义就是从i到j经过一条边所需的最小距离

i到i显然经过了0条边,自然是inf

最后,我们的矩阵快速幂的当前值肯定有个初始值,

正常矩阵快速幂肯定有个单位矩阵来做初始值,也就是说这个矩阵“乘”任何一个矩阵都是那个矩阵

这里没必要费心思去找这个单位矩阵

只需要把当前值先赋成dp[i][j][1],再n--即可

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std; const int maxn=2e2+; int num,n;
map<int,int> mapp; struct Node
{
int dp[maxn][maxn];
friend Node operator * (const Node &x,const Node &y)
{
Node z;
memset(z.dp,0x3f,sizeof(z.dp));
for(int k=;k<=num;k++) for(int i=;i<=num;i++) for(int j=;j<=num;j++) z.dp[i][j]=min(z.dp[i][j],x.dp[i][k]+y.dp[k][j]);
return z;
}
}now,ans; void chuli()
{
ans=now,n--;
while(n)
{
if(n&) ans=ans*now;
n>>=,now=now*now;
}
} int main()
{
int s,e,t,x,y,z;
scanf("%d%d%d%d",&n,&t,&s,&e);
memset(now.dp,0x3f,sizeof(now.dp));
while(t--)
{
scanf("%d%d%d",&z,&x,&y);
if(!mapp[x]) mapp[x]=++num;
if(!mapp[y]) mapp[y]=++num;
now.dp[mapp[x]][mapp[y]]=z;
now.dp[mapp[y]][mapp[x]]=z;
}
chuli();
printf("%d",ans.dp[mapp[s]][mapp[e]]);
return ;
}

题目分享D 二代目的更多相关文章

  1. 题目分享E 二代目

    题意:一棵点数为n的树,每个节点有点权,要求在树中中找到一个最小的x,使得存在一个点满足max(该点点权,该点相邻的点的点权+1,其他点的点权+2)=x 分析:首先要能把题目转化为上述题意 首先题目让 ...

  2. 题目分享C 二代目

    题意:一个数列是由 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6.....组成,也就是1-1,1-2,1-3......并且如果遇到多位数也要拆成数字比如1-10 ...

  3. 题目分享H 二代目

    题意:有m个限制,每个限制l1,r1,l2,r2四个数,限制了一个长度为n的数第l1到r1位要与第l2到r2相同,保证r1-l1=r2-l2,求在限制下一共有多少种数 分析: 暴力的话肯定是从l1-r ...

  4. 题目分享G 二代目

    题意:有n组数,每组包含两个数,问在每组只能取一个的前提下能组成的最长的从1开始的连续自然数有几个? 分析:刚学了差分约束系统,很容易往转换成图的方向去想 将他读入的这n组数当成边读入 很容易会得到一 ...

  5. 题目分享F 二代目

    题意:T个点R种双向边,P种单向边,求点S到每个点的最短距离 分析:(这再看不出来是spfa就该**了) 首先,这题能否用spfa就看他是否有负环呗,显然,双向边的权值非负,单向边还有个啥政策,总之显 ...

  6. 2019年腾讯PHP程序员面试题目分享

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com 1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除 ...

  7. 20190924-LeetCode解数独题目分享

    解决数独 题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以 ...

  8. 题目分享X

    题意:一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票.有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进 ...

  9. 题目分享V

    题意:现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k(k可以是任意整数,每次不一定相同)现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话Yes,否则No. 分 ...

随机推荐

  1. es搜索排序不正确

    沿用该文章里的数据https://www.cnblogs.com/MRLL/p/12691763.html 查询时发现,一模一样的name,但是相关度不一样 GET /z_test/doc/_sear ...

  2. shell http请求&处理返回值获取其中某个字段的值

    并且第一个接口的返回值中部分参数得作为第二个接口的入参,所以做了如下shell验证 第一个接口返回的response body串: { "bizCode": "1&quo ...

  3. k8s Service学习

    service的概念 kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务.这组pod能够被service访问到,通常通过label se ...

  4. http的长连接和websocket的区别

    一.什么是http协议 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0.   HTTP/1.* 一次请求-响应,建立一个连接,用完关闭: HTTP/1.1 串行化 ...

  5. leetcode c++做题思路和题解(2)——链表的例题和总结

    链表的例题和总结 0. 目录 环形链表 1. 环形链表 题目: https://leetcode-cn.com/problems/linked-list-cycle/ 看了别人的思路真是感概万千,思路 ...

  6. 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码

    目录(?)[-] 官方文档 类装载 两种装载方法的区别 不同的类装载器 是否实例化类 在jdbc链接数据库中的应用 资源   原文地址:http://yanwushu.sinaapp.com/clas ...

  7. 文件密码忘记了怎么办,教你如何使用Python破解密码

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:轻松学编程小梁 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. 全网最全最细的jmeter接口测试教程以及接口测试流程详解

    一.Jmeter简介 ​ Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试. Jmeter具备高移植性,可以实现跨平台运行. Jmeter可以实 ...

  9. MySQL笔记总结-DML语言

    DML语言 插入 一.方式一 语法: insert into 表名(字段名,...) values(值,...); 特点: 1.要求值的类型和字段的类型要一致或兼容 2.字段的个数和顺序不一定与原始表 ...

  10. 数值计算方法实验之Lagrange 多项式插值 (Python 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...