题意:
给你n,m。m*m的邻接矩阵,问你从一个点到一个点,走过n个点(n=1的话,就不走边。)【n-1条边】最长路是多少。
POINT:
快速幂+Floyd的应用。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL maxn=100+10;
const LL inf = 0x3f3f3f3f;
LL n;
struct node
{
LL a[maxn][maxn];
void init(){
memset(a,0,sizeof a);
}
node friend operator * (node a,node b)
{
node c;
c.init();
for(LL k=1;k<=n;k++){
for(LL i=1;i<=n;i++){
for(LL j=1;j<=n;j++){
if(b.a[k][j]!=0)
if(c.a[i][j]<a.a[i][k]+b.a[k][j])
c.a[i][j]=a.a[i][k]+b.a[k][j];
}
}
}
return c;
}
};
node a,ans;
int main()
{
LL k;
while(~scanf("%lld%lld",&k,&n)){
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)
scanf("%lld",&a.a[i][j]);
k--;
ans.init();
while(k){
if(k&1) ans=ans*a;
a=a*a;
k>>=1;
}
LL s=0;
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)
s=max(s,ans.a[i][j]);
printf("%lld\n",s);
}
return 0;
}