【Luogu】P2886牛继电器(矩阵加速floyd)

  题目链接

  矩阵加速floyd……牛逼牛逼。

  注意离散化,注意更新的时候要用旧的权值矩阵更新。

  

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#define maxn 300
#define check(x) if(x==0)    x=++size;
using namespace std;

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==‘-‘)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

int size,n;

struct Matrix{
    long long s[maxn][maxn];
    void clear(){memset(s,127/3,sizeof(s));}
    Matrix operator *(const Matrix x){
        Matrix ans;
        for(int k=1;k<=size;++k)
            for(int i=1;i<=size;++i)
                for(int j=1;j<=size;++j)    ans.s[i][j]=min(ans.s[i][j],s[i][k]+x.s[k][j]);
        return ans;
    }
};

Matrix Pow(Matrix now,int x){
    Matrix ret;    memset(ret.s,0,sizeof(ret.s));
    for(int i=1;i<=size;++i)    ret.s[i][i]=1;
    while(x){
        if(x&1)    ret=ret*now;
        now=now*now;
        x>>=1;
    }
    return ret;
}

int id[maxn*4];

int main(){
    int m=read(),e=read(),Start=read(),End=read();
    Matrix ret;ret.clear();
    for(int i=1;i<=n;++i){
        int len=read(),x=read(),y=read();
        check(id[x]);    check(id[y]);
        ret.s[id[x]][id[y]]=len;
    }
    ret=Pow(ret,m);
    printf("%d",ret.s[id[Start]][id[End]]);
    return 0;
}

原文地址:https://www.cnblogs.com/cellular-automaton/p/8367668.html

时间: 2024-10-31 07:31:10

【Luogu】P2886牛继电器(矩阵加速floyd)的相关文章

牛盾云加速架构分享之SACC演讲

站在互联网+风口上,重点探讨高可用架构设计.存储技术架构.CDN和网络架构优化.前端技术进展.移动应用架构设计.IT架构新思维.运维2.0等技术的2015中国系统架构师大会迎来了一次里程碑的盛况.如何同时满足高安全.高可靠和高依赖的行业架构?如何应对海量实时的大流量.高并发.高响应.高实时的互联网架构需求?牛盾云加速为此做出的贡献与探索无疑对得起大家的掌声.今天小编就给各位带来此次大会上大神kindle充分准备的干货与大家分享,希望给有幸参加会议的诸位加深回忆,也给未能与会的朋友们一些参考,让大

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

https://www.vijos.org/p/1067 很容易推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵,其中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每个数分别对应f[n-1],f[n-2],,f[n-k]的系数.然后构造一个k*1的矩阵,它的第i行代表f[i],是经过直接递推得到的.设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵,f[n]就是ans[k][1]. 注意:用__int64 #in

【矩阵加速】 矩阵 快速幂

矩阵的快速幂是用来高效地计算矩阵的高次方的.将朴素的o(n)的时间复杂度,降到log(n). 这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍: 一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的n次幂. 但做下简单的改进就能减少连乘的次数,方法如下: 把n个矩阵进行两两分组,比如:A*A*A*A*A*A => (A*A)*(A*A)*(A*A) 这样变的好处是,你只需要计算一次A*A,然后将结果(A*A)连乘自己两次就能得到A^6,即(A*A)^3=A^6.算一下发现这次一共乘

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

HDU 5564 Clarke and digits 状压dp+矩阵加速

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[i][j][k]表示长度为i,并且对7取模得到j的以k结尾的数. 则有状态转移方程dp[i+1][(h*10)+l)%7][k]+=dp[i][h][k'](k+k'!=K). 但是i范围是1~10^9,需要矩阵加速. 这里对dp[i][j][k]的[j][k]两个状态进行压缩,得到转移矩阵mat[

斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 举个例子,对于长度为1到3的棋盘,我们有下面几种覆盖方式: 提示:骨牌覆盖 提示:如何快速计算结果 输入 第1行:1个整数N.表示棋盘长度.1≤N≤100,000,000 输出 第1行:1个整数,表示

P1939 【模板】矩阵加速(数列)

链接:P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入输出格式 输入格式: 第一行一个整数T,表示询问个数. 以下T行,每行一个正整数n. 输出格式: 每行输出一个非负整数表示答案. 输入输出样例 输入样例#1: 3 6 8 10 输出样例#1: 4 9 19 说明 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7

POJ3420 Quad Tiling (矩阵加速状压dp)

传送门:http://poj.org/problem?id=3420 Quad Tiling Time Limit: 1000MS   Memory Limit: 65536K       Description Tired of the Tri Tiling game finally, Michael turns to a more challengeable game, Quad Tiling: In how many ways can you tile a 4 × N (1 ≤ N ≤ 1

HDU 3117 Fibonacci Numbers(Fibonacci矩阵加速递推+公式)

题目意思很简单:求第n个Fibonacci数,如果超过八位输出前四位和后四位中间输出...,否则直接输出Fibonacci数是多少. 后四位很好求,直接矩阵加速递推对10000取余的结果就是. 前四位搜了一下:http://blog.csdn.net/xieqinghuang/article/details/7789908 Fibonacci的通项公式,对,fibonacci数是有通项公式的-- f(n)=1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n