POJ 3613 Cow Relays

POJ次元传送门

题意:求对于一张稀疏图上X->Y的经过K条边的最短路长度
分析:矩阵乘法,不说啥了
我的做法:写个函授里边默写个Floyd,然后递归跑就好
不多收,125MS代码双手奉上
还有,Markdown不造抽什么风,粘个代码都BUG…….
所以,By YOUSIKI 就写在这里了,来日再改罢
顺便纪念一下和Visual Code的初识,虽然她并不能编译调试,但轻量漂亮还是蛮讨人爱的
还有她的小伙伴Atom,丰富的皮肤也是大赞啊

代码实现

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105,maxm=1005;
int mp[maxm],cnt=0;
struct mar{
    int m[maxn][maxn];
    mar(){
        memset(m,-1,sizeof(m));
    }
}A;
mar mul(mar a,mar b){
    mar ans;
    for(int k=0;k<cnt;k++)
        for(int i=0;i<cnt;i++)
            for(int j=0;j<cnt;j++){
                if(a.m[i][k]==-1||b.m[k][j]==-1)
                    continue;
                if(ans.m[i][j]==-1||ans.m[i][j]>a.m[i][k]+b.m[k][j])
                    ans.m[i][j]=a.m[i][k]+b.m[k][j];
            }
    return ans;

}
mar pow(int k){
    if(k==1)    return A;
    mar B=pow(k/2);
    if(k&1)     return mul(A,mul(B,B));
    else        return mul(B,B);
}
int main(){
    memset(mp,-1,sizeof(mp));
    int k,m,x,y;
    cin>>k>>m>>x>>y;
    for(int i=0;i<m;i++){
        int a,b,w;
        cin>>w>>a>>b;
        if(mp[a]==-1)   mp[a]=cnt++;
        if(mp[b]==-1)   mp[b]=cnt++;
        A.m[mp[a]][mp[b]]=w;
        A.m[mp[b]][mp[a]]=w;
    }
    printf("%d",pow(k).m[mp[x]][mp[y]]);
    return 0;
}

你可能感兴趣的:(poj)