2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)
2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)
[P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
给出一张无向连通图,求S到E经过k条边的最短路。
分析:
对于floyed,在第k个点时,任意的i到j之间的最短路已经经过了(k-1)个点。当fa[i] [j]经过了x条边,fb[i] [j]经过了y条边,想要算出经过了x+y条边,只需要按照floyed的算法算出fc[i] [j]=min(fa[i] [k]+fb[k] [j],fc[i] [j]),有些像矩阵乘法的算法,那就开始吧~
注:记得对于矩阵的dis初始化/哭唧唧!
[题解 P2886 【USACO07NOV]牛继电器Cow Relays】 - player 的博客 - 洛谷博客 (luogu.com.cn)
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
//#define int long long
const int N=1e6+10;
const int inf=0x3f3f3f3f;
int n,start,endi,m,top;
map<int,int>mapi;
struct matrix{
	int a[510][510];
	matrix operator *(const matrix &b)const{
		matrix c;
		memset(c.a,inf,sizeof(c.a));
		for(int k=1;k<=top;k++)
		for(int i=1;i<=top;i++)
		for(int j=1;j<=top;j++)
		c.a[i][j]=min(c.a[i][j],a[i][k]+b.a[k][j]);
		return c;
	}
}dis,ans;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*w;
}
inline void ksm(){
	--n;ans=dis;
	while(n){
		if(n&1)ans=ans*dis;
		dis=dis*dis;
		n>>=1;
	}
}
signed main(){
	memset(dis.a,inf,sizeof(dis.a));
	n=read();m=read();start=read();endi=read();
	for(int i=1;i<=m;i++){
		int w,u,v;
		w=read();u=read();v=read();
		if(!mapi[u])mapi[u]=++top;
		if(!mapi[v])mapi[v]=++top;
		u=mapi[u];v=mapi[v];
		dis.a[u][v]=dis.a[v][u]=w;
	}
	ksm();
	cout<<ans.a[mapi[start]][mapi[endi]];
	return 0;
}
												
											2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)的更多相关文章
- 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)
		
本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...
 - 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
		
题目大意 洛谷链接 给定一张\(T\)条边的无向连通图,求从\(S\)到\(E\)经过\(N\)条边的最短路长度. 输入格式 第一行四个正整数\(N,T,S,E\),意义如题面所示. 接下来\(T\) ...
 - [USACO07NOV]Cow Relays G
		
题目大意 给出一张无向连通图(点数小于1000),求S到E经过k条边的最短路. 算法 这是之前国庆模拟赛的题 因为懒 所以就只挑一些题写博客 在考场上写了个dp 然后水到了50分 出考场和神仙们一问才 ...
 - 2021.11.03 P6175 无向图的最小环问题
		
2021.11.03 P6175 无向图的最小环问题 P6175 无向图的最小环问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给定一张无向图,求图中一个至少包含 33 ...
 - [USACO07NOV]Cow Relays
		
map+floyed+矩阵乘法(倍增floyed) # include <stdio.h> # include <stdlib.h> # include <iostrea ...
 - [luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)
		
传送门 矩阵快速幂,本质是floyd 把 * 改成 + 即可 注意初始化 因为只有100条边,所以可以离散化 #include <cstdio> #include <cstring& ...
 - POJ 3631 Cow Relays Floyd+矩阵快速幂
		
题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
 - poj 3613 Cow Relays【矩阵快速幂+Floyd】
		
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
 
随机推荐
- python练习册 每天一个小程序 第0004题
			
1 #-*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述:任一个英文的纯文本文件,统计其中的单词出现的个数. 5 参考学习链接: 6 re ht ...
 - Redis快速入门:初识Redis
			
[IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持 ...
 - 航模电池平衡头接线,1S-6S原理图
			
1-4S平衡头接线 S数代表几级锂电池串联,比如3S代表串联了3级,所以总电压为3*3.7V=11.4V.(每一级可能是多个电芯并联) 图源:百度贴吧 图源:5imx论坛 3S电池示例 B6充电器
 - K-good   number Theory + 数学问题
			
这道题是我做CodeTon Round1时的D题,总的来看思路很重要,有几个比较明显的切入问题的角度,要选择到最优的那个: 先看题目: 我们可以发现,这道题的描述一目了然,就是说我们能不能找k个数的和 ...
 - super.getClass()方法调用?
			
下面程序的输出结果是多少? import java.util.Date; public class Test extends Date{ public static void main(String[ ...
 - 最长公共子序列(LCS动态规划)?
			
// dp[i][j] 计算去最大长度,记住口诀:相等左上角加一,不等取上或左最大值function LCS(str1, str2){ var rows = str1.split(&q ...
 - Dubbo 支持服务降级吗?
			
以通过 dubbo:reference 中设置 mock="return null".mock 的值也可以修改 为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规 ...
 - UML 中有哪些常用的图?
			
UML 定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结 构,包括:用例图(use case diagram).类图(class diagram).时序图(sequence diagr ...
 - spring-boot-learning-Web开发知识
			
1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业务代码: 文件名的功能 x ...
 - Java 死锁以及如何避免?
			
Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.