[POJ3613] Cow Relays(Floyd+矩阵快速幂)

Posted zfio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POJ3613] Cow Relays(Floyd+矩阵快速幂)相关的知识,希望对你有一定的参考价值。

解题报告

感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊。

题意

给定一个T(2 <= T <= 100)条边的无向图,求SE恰好经过N(2 <= N <= 1000000)条边的最短路。

Idea

用Floyd和矩阵快速幂优化的产物。具体等下了课我会再更新的...

#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<cstring>
#define ll long long
#define Dio ios::sync_with_stdio(0);
using namespace std;
const int maxn=200+1;
ll n,m,x,y,z,K;
map<int ,int> mapp;//数据中最多有100条边,说明最多有200个点,然鹅点的编号可达1000,所以离散化一下
struct Matrix{//矩阵的类
    int a[maxn][maxn];
    Matrix operator *(const Matrix& r){//按floyd重载矩阵乘法
        Matrix c;
        memset(c.a,0x3f,sizeof(c.a));
        for(int k=1;k<=n;k++)//floyd模板
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            c.a[i][j]=min(c.a[i][j],a[i][k]+r.a[k][j]);
        }
        return c;
    }
}st,ans;
void Pow(){//快速幂模板
    ans=st;
    K--;
    while(K){
        if(K&1)  ans=ans*st;
        st=st*st;
        K>>=1;
    }
}
int main(){
    Dio
    ll s,t;
    cin>>K>>m>>s>>t;
    memset(st.a,0x3f,sizeof(st.a));
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>z>>x>>y;
        if(mapp[x]) x=mapp[x];
        else x=mapp[x]=++n;
        if(mapp[y]) y=mapp[y];
        else y=mapp[y]=++n;
        st.a[x][y]=st.a[y][x]=z;
    }
    Pow();
    cout<<ans.a[mapp[s]][mapp[t]]<<endl;
    return 0;
}

以上是关于[POJ3613] Cow Relays(Floyd+矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章

POJ3613Cow Relays

Cow Relays POJ - 3613

poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

poj3613Cow Relays——k边最短路

poj 3613 Cow Relays矩阵快速幂+Floyd

[POJ3613] Cow Relays(Floyd+矩阵快速幂)