https://daniu.luogu.org/problem/show?pid=2886
直接矩阵暴力就好了;
其实就是floyd;
然后么,别人离散之后快的飞起;
当然不离散也是可以过的;
自己本地测直接爆栈;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Ll long long
using namespace std;
struct jv{
int n,m;
Ll a[1001][1001];
jv(){n=m=0;memset(a,63,sizeof a);}//63==0x3f
}a,ans;
int n,m,k,x,y,S,E,v;
jv cheng(jv a,jv b){
jv ans; ans.n=a.n; ans.m=b.m;
for(int i=1;i<=a.n;i++)
for(int k=1;k<=a.m;k++)if(a.a[i][k]<1e18)
for(int j=1;j<=b.m;j++)
ans.a[i][j]=min(ans.a[i][j],a.a[i][k]+b.a[k][j]);
return ans;
}
jv ksm(int y){
jv ans=a,c=a;
y-=1;
while(y){
if(y&1)ans=cheng(ans,c);
y>>=1;
c=cheng(c,c);
}
return ans;
}
int main()
{
scanf("%d%d%d%d",&k,&n,&S,&E);
a.n=a.m=1000;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&v,&x,&y);
a.a[y][x]=a.a[x][y]=v;
}
ans=ksm(k);
printf("%lld",ans.a[S][E]);
}