求助大佬!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 102;
const int MAXM = 2502;
const ll oo = 0x3f3f3f3f3f3f3f3f;
struct Edge
{
int u,v,w;
};
int n,m,k;
ll f2[MAXN];
ll tmp[MAXN];
Edge edges[MAXM];
ll dis[MAXN][MAXN];
ll f[20][MAXN][MAXN];
void Floyd()
{
memset(dis,oo,sizeof(dis));
for(int i = 1;i <= n;i++)
dis[i][i] = 0;
for(int i = 1;i <= m;i++)
{
Edge &cur = edges[i];
dis[cur.u][cur.v] = cur.w;
}
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
}
int main()
{
ios::sync_with_stdio(false);
#ifdef WSH
freopen("Dk8se.in", "r", stdin);
//freopen("Dk8se.out","w",stdout);
#endif
cin >> n >> m >> k;
for(int i = 1;i <= m;i++)
{
int u,v,w;
cin >> u >> v >> w;
edges[i] = {u,v,w};
}
Floyd();
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
ll tmp = dis[i][j];
for(int k = 1;k <= m;k++)
{
Edge &cur = edges[k];
tmp = min(tmp,dis[i][cur.u] + dis[cur.v][j] - cur.w);
}
f[0][i][j] = tmp;
}
}
for(int l = 1;l <= log2(k);l++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
for(int k = 1;k <= n;k++)
f[l][i][j] = min(f[l][i][j],f[l - 1][i][k] + f[l - 1][k][j]);
for(int i = 1;i <= n;i++)
f2[i] = dis[1][i];
for(int l = 0;l <= log2(k);l++)
{
if(!(k >> l & 1))
continue;
memcpy(tmp,f2,sizeof(f2));
memset(f2,oo,sizeof(f2));
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
f2[i] = min(f2[i],tmp[j] + f[l][j][i]);
}
cout << f2[n] << endl;
return 0;
}