POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)
题意:
给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走。
思路:
感觉很赞的一个题目,据说证明是什么国家队集训队论文什么的,自己没去看那个论文,就说下我自己的理解吧,对于这个题目,我们首先分析下Floyd,那个算法的过程中是在更新的dis[i][j]上再更新,再更新。。。,是想一下,我们每次都把更新的结果存下来,就是每次答案数组初始化全是INF,然后用当前的dis数组和原始的map来更新,那么更新得到的就应该是dis的状态下在多走一条边到达各个点的最短,就这样,想得到第几条边的最短路就更新几次就行了,只要结构如下
now初始化INF
for(int k = 1 ;k <= n ;k ++)
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
now[i][j] = min(now[i][j] ,dis[i][k] + map[k][j]);
dis是上一步的now,map是原始的图,有点dp的意思,如果不理解可以这样写
now初始化INF
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
for(int k = 1 ;k <= n ;k ++)
now[i][j] = min(now[i][j] ,dis[i][k] + map[k][j]);
这样就方便理解了,就是在原来的基础上在多加(强制)一条边去更新,不要感觉说Floyd的三重for循环不能调换这里面就不能调换,其实这里面的根本不是Floyd我们要的只是在加一条边更新所有,所以怎么写都行,然后就是这个题目的另一个关键,如果直接就写估计会超时,这是我们可以用类似矩阵快速幂的方式去优化,如果用到快速幂就要证明a^b = a^2(b/2)这个地方我不能说太多,因为怕说错了,我只是感觉因为这个题目的过程满足结合律,所以满足上面的那个式子,具体的就看下面代码吧。
#include<stdio.h>
#include<string.h>
#define N 220
#define INF 1000000000
typedef struct
{
int mat[N][N];
}A;
int mark[1100];
int minn(int x, int y)
{
return x < y ? x : y;
}
A Floyd (A a ,A b ,int n)
{
A c;
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
c.mat[i][j] = INF;//这个地方看好了,是初始化成INF,不是平时的Floyd直接就在更新的数组上在更新。
for(int k = 1 ;k <= n ;k ++)
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
//for(int k = 1 ;k <= n ;k ++)
c.mat[i][j] = minn(c.mat[i][j] ,a.mat[i][k] + b.mat[k][j]);
return c;
}
A Qpow_Mat(A a ,int b ,int n)
{
A c;
int mk = 0;
while(b)
{
if(b & 1)
{
!mk ? c = a : c = Floyd(c ,a ,n);
mk = 1;
}
b >>= 1;
a = Floyd(a ,a ,n);
}
return c;
}
int main ()
{
int n ,t ,s ,e ,i ,j ,a ,b ,c ,nowid;
A Ans;
scanf("%d %d %d %d" ,&n ,&t ,&s ,&e);
{
memset(Ans.mat ,255 ,sizeof(Ans.mat));
memset(mark ,0 ,sizeof(mark)) ,nowid = 0;
for(i = 1 ;i <= t ;i ++)
{
scanf("%d %d %d" ,&c ,&a ,&b);
if(!mark[a]) mark[a] = ++nowid;
if(!mark[b]) mark[b] = ++nowid;
a = mark[a] ,b = mark[b];
Ans.mat[a][b] = Ans.mat[b][a] = c;
}
for(i = 1 ;i <= nowid ;i ++)
for(j = 1 ;j <= nowid ;j ++)
if(Ans.mat[i][j] == -1) Ans.mat[i][j] = INF;
Ans = Qpow_Mat(Ans ,n ,nowid);
printf("%d\n" ,Ans.mat[mark[s]][mark[e]]);
}
return 0;
}
POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)的更多相关文章
- A* 算法求第k短路径
A*算法是一类贪心算法,其可以用于寻找最优路径.我们可以利用A*算法来求第k短路径. 一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短 ...
- POJ --- 3613 (K步最短路+矩阵快速幂+floyd)
Cow Relays Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided ...
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
- POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)
Sumdiv Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- POJ 1995 快速幂模板
http://poj.org/problem?id=1995 简单的快速幂问题 要注意num每次加过以后也要取余,否则会出问题 #include<iostream> #include< ...
- Poj 1125 Stockbroker Grapevine(Floyd算法求结点对的最短路径问题)
一.Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a ...
- poj 1995 快速幂
题意:给出A1,…,AH,B1,…,BH以及M,求(A1^B1+A2^B2+ … +AH^BH)mod M. 思路:快速幂 实例 3^11 11=2^0+2^1+2^3 => 3^1*3 ...
- Raising Modulo Numbers(POJ 1995 快速幂)
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5934 Accepted: ...
- POJ 2253:Frogger 求每一条路径最大值里面的最小值
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31490 Accepted: 10150 Descrip ...
随机推荐
- docker在vulhub中的使用命令合集
(1)docker ps(查询 docker 进程的所有容器) (2)docker info(查看docker详细信息) (3)service docker start(启动docke ...
- shell脚本,mysql数据库的备份-2[mysqldump]
# 数据库IPIP=127.0.0.1# 数据库端口PORT=3306# 数据库用户USER=root# 数据库密码PASSWORD=****# 要备份的数据库TARGET_DB=database_n ...
- JPress企业站主题-zbout
JPress企业站主题-zbout 经典的黑白灰颜色搭配风格,首页配置有轮播图.案例展示.公司简介.新闻中心.联系方式以及合作伙伴模块,全站使用了响应式结构,可以自适应电脑端和手机端浏览器访问.主题整 ...
- 死磕Spring之IoC篇 - @Bean 等注解的实现原理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Spring Boot 轻量替代框架 Solon 的架构笔记 - new
Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...
- BuaacodingT651 我知道你不知道圣诞节做什么 题解(逻辑)
题目链接 我知道你不知道圣诞节做什么 解题思路 第一句话:x,y不都为质数. 第二句话:对于xy=t,存在唯一一种x+y使得x,y不都为质数. 第三句话:对于x+y=s,存在唯一一种t=xy使得对于任 ...
- 使用quartz.net 完成一个winform版的任务提醒工具
这个任务提醒工具是这样的,是每日定时执行,触发时间为 小时和分钟.每天早上来就可以把当天要做的添加到datagridview中,只记录了标题和内容和时间.双击dgv就查看内容. 如果每天计划重复,也可 ...
- 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters
问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...
- 详解 ZooKeeper 数据持久化
本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...
- OpenCV 之 图象几何变换
二维平面中,图像的几何变换有等距.相似.仿射.投影等,如下所示: 1 图象几何变换 1.1 等距变换 等距变换 (Isometric Transformation),是一种二维的刚体变换,可理解为 ...