码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-28 15:27:07      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:idea   更新   最短路   syn   ide   opera   max   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+矩阵快速幂)

标签:idea   更新   最短路   syn   ide   opera   max   floyd   重载   

原文地址:https://www.cnblogs.com/Zfio/p/12793843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!