题目大意: 给出一张无向连通图,求S到E经过k条边的最短路。
把矩乘换成floyd ..
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=9999999;
int n,k,S,T;
string m;
struct mat
{
int m[101][101];
}unit,a;
mat mul(mat a,mat b)
{
mat t;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)t.m[i][j]=INF;
for(int k=0;k<n;++k)
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
{
if(t.m[i][j]>a.m[i][k]+b.m[k][j])
t.m[i][j]=a.m[i][k]+b.m[k][j];
}
return t;
}
mat pow(mat a,int b)
{
mat r=unit;
while(b)
{
if(b&1)r=mul(r,a);
a=mul(a,a);
b>>=1;
}
return r;
}
int main()
{
scanf("%d %d %d %d",&n,&S,&T,&k);
S--,T--;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
{
unit.m[i][j]=INF;
scanf("%d",&a.m[i][j]);
if(a.m[i][j]==-1)a.m[i][j]=INF;
}
for(int i=0;i<n;++i)unit.m[i][i]=0;
mat r=pow(a,k);
printf("%d",r.m[S][T]);
return 0;
}