【图论】USACO07NOV Cow Relays G
题目大意
洛谷链接
给定一张\(T\)条边的无向连通图,求从\(S\)到\(E\)经过\(N\)条边的最短路长度。
输入格式
第一行四个正整数\(N,T,S,E\),意义如题面所示。
接下来\(T\)行每行三个正整数\(w,u,v\)分别表示路径的长度,起点和终点。
输出格式
一行一个整数表示图中从\(S\)到\(E\)经过\(N\)条边的最短路长度。
数据范围
对于所有的数据,保证\(1\le N\le 10^6,2\le T\le 100\)。
所有的边保证\(1\le u,v\le 10001,1\le w\le 1000\)。
样例输入
2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
样例输出
10
思路
假设有两个矩阵,一个代表恰好经过\(x\)条边的最短路,另外一个代表恰好经过\(y\)条边的最短路。只要把两个矩阵合就可以了。
\(c[i][j]=a[i][k]+b[k][j]\);
其实还是Floyd。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int num[1000005];
int n,s,t,e,tot;
struct map{
int a[500][500];
map operator * (const map &x) const{
map c;
memset(c.a,0x3f,sizeof(c.a));
for(int k=1;k<=tot;k++)
for(int i=1;i<=tot;i++)
for(int j=1;j<=tot;j++)
c.a[i][j]=min(c.a[i][j],a[i][k]+x.a[k][j]);
return c;
}
}dis,ans;
void init(){
memset(dis.a,0x3f,sizeof(dis.a));
int x,y,z;
scanf("%d%d%d%d",&n,&t,&s,&e);
for(int i=1;i<=t;i++){
scanf("%d%d%d",&x,&y,&z);//离散化
if(!num[y])
num[y]=++tot;
if(!num[z])
num[z]=++tot;
dis.a[num[y]][num[z]]=dis.a[num[z]][num[y]]=x;
}
}
void work(){//矩阵快速幂
n--;
ans=dis;
while(n){
if(n&1)
ans=ans*dis;
dis=dis*dis;
n>>=1;
}
}
int main(){
init();
work();
printf("%d",ans.a[num[s]][num[e]]);
cout<<ans.a[num[s]][num[e]];
}
【图论】USACO07NOV Cow Relays G的更多相关文章
- 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)
2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ...
- USACO07NOV Cow Relays G 题解
题目 For their physical fitness program, \(N (2 ≤ N ≤ 1,000,000)\) cows have decided to run a relay ra ...
- [USACO07NOV]Cow Relays G
题目大意 给出一张无向连通图(点数小于1000),求S到E经过k条边的最短路. 算法 这是之前国庆模拟赛的题 因为懒 所以就只挑一些题写博客 在考场上写了个dp 然后水到了50分 出考场和神仙们一问才 ...
- 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)
本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...
- [USACO07NOV]Cow Relays
map+floyed+矩阵乘法(倍增floyed) # include <stdio.h> # include <stdlib.h> # include <iostrea ...
- Poj 3613 Cow Relays (图论)
Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...
- POJ3613 Cow Relays [矩阵乘法 floyd类似]
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7335 Accepted: 2878 Descri ...
- poj3613 Cow Relays【好题】【最短路】【快速幂】
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions:9207 Accepted: 3604 Descrip ...
- poj 3613 Cow Relays
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5411 Accepted: 2153 Descri ...
随机推荐
- 用c语言处理文件
用c语言处理文件只需要用到几个简单的函数: 1.文件的打开和关闭 fopen()函数用来打开一个文件,该函数原型在头文件stdio.h中,调用的一般形式为 /* FILE 是c语言内置的一个结构体类型 ...
- docker导出导入镜像docker save和docker load的用法
1.百度搜的第一步是先将容器提交为镜像,然后用你提交的镜像去做上面的备份操作,提交为镜像后会新增一个镜像,但是感觉没有必要,直接做上面的save操作也是可以用的 百度的:docker commit 容 ...
- [Spark快速大数据分析]阅读笔记
第2章 Spark分布式执行涉及的组件 每个Spark应用都由一个驱动程序来发起集群上的各种并行操作,驱动程序通过一个SparkContext对象访问Spark:驱动程序管理多个执行器节点,可以用Sp ...
- MySQL页分裂和页合并
预备知识了解,索引页,数据页,b+tree 页是innoDB中管理储存空间的基本单位,页有很多中,存放数据的叫做索引页.
- k8s健康检查(七)
默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness ...
- nginx.config 多个方案解决跨域问题
#user nobody; user sam owner; worker_processes 1; #error_log logs/error.log; #error_log logs/error.l ...
- matlab数字图像处理-给图片加入可视水印信息
将文件夹路径改成了我想要存放代码的文件夹下 然后也是在网上百度,找到了一个代码,敲着模仿了一个 自己建立了一个脚本文件 >>edit test1 然后在脚本中添加 %读取待嵌入水印的图像和 ...
- 关于MongoDB
启动: 启动MongoDB的方式有两种: 1.直接启动,配置参数写在命令中: mongod --dbpath=data/db --logpath=log/log.txt --fork 2.以配置文件启 ...
- hystrix(5) 使用
这一节我们开始了解hystrix执行的主流程,在讲解主流程之前,我们先来看一下怎么使用hystrix. 引入jar <dependency> <groupId>com.netf ...
- python的多种魔术方法
目录 new str & repr iter getitem.setitem.delitem getattr.setattr.delattr call slots 定制类和魔法方法 new s ...