zoukankan      html  css  js  c++  java
  • http://47.95.147.191/problem/P3

    http://47.95.147.191/problem/P3
    规定边数的最短路,跑floyd+矩阵快速幂

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<ctime>
    #include<set>
    #include<map>
    #include<stack>
    #include<cstring>
    #define inf 2147483647
    #define For(i,a,b) for(long long i=a;i<=b;i++)
    #define p(a) putchar(a)
    #define g() getchar()
    #define mod 1000000007
    //by war
    //2020.2.26
    using namespace std;
    long long n,k,S,T,x,y,lim,c;
    long long m[1010];
    struct matrix{
        long long a[310][310];
        matrix operator*(const matrix&b)const{
            matrix r;
            For(i,1,n)
                For(j,1,n){
                    r.a[i][j]=inf;    
                    For(k,1,n)
                    r.a[i][j]=min(r.a[i][j],a[i][k]+b.a[k][j]);
                }
            return r;
        }
    }a;
    void in(long long &x)
    {
        long long y=1;
        char c=g();x=0;
        while(c<'0'||c>'9')
        {
        if(c=='-')
        y=-1;
        c=g();
        }
        while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
        x*=y;
    }
    void o(long long x)
    {
        if(x<0)
        {
            p('-');
            x=-x;
        }
        if(x>9)o(x/10);
        p(x%10+'0');
    }
    
    matrix ksm(matrix a,long long b){
        matrix r=a;b--;
        while(b>0){
            if(b%2==1) r=r*a;
            a=a*a;
            b>>=1;
        }
        return r;
    }
    
    int main(){
        in(lim);in(k);in(S);in(T);
        For(i,0,300)
            For(j,0,300)
                a.a[i][j]=inf;
        For(i,1,k){
            in(c);in(x);in(y);
            if(!m[x]) m[x]=++n;
            if(!m[y]) m[y]=++n;
            a.a[m[x]][m[y]]=a.a[m[y]][m[x]]=c;
        }
        matrix r=ksm(a,lim);
        o(r.a[m[S]][m[T]]);
        return 0;
    }
  • 相关阅读:
    算法训练 2的次幂表示
    算法训练 进制转换
    算法训练 Beaver's Calculator (蓝桥杯)
    抽签问题(不断优化)
    矩阵快速幂
    斐波那契数列
    找出最小自然数N,使N!在十进制下包含Q个0(输入Q,输出N)
    二维数组名是指针的指针吗?
    StringBuffer
    Lake Counting (POJ No.2386)
  • 原文地址:https://www.cnblogs.com/war1111/p/12368053.html
Copyright © 2011-2022 走看看