题意:求一个图的s到e的长度为k的最短路
解:每次只通过一个节点来疏松原图
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1007;
const int inf = 999999999;
const int mod = 10007;
char str[10][10];
int n, m, s, e;
struct node
{
int m[210][210];
node()
{
for(int i=0; i<210; i++)
for(int j=0; j<210; j++)
m[i][j]=inf;
}
};
int vis[2200];
node quick(node &x,node &y)
{
node z;
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
z.m[i][j]=min(z.m[i][j],x.m[i][k]+y.m[k][j]);
return z;
}
node mul(node x,int cnt)
{
node y;
for(int i=1; i<=n; i++) y.m[i][i]=0;
while(cnt)
{
if(cnt&1) y=quick(y,x);
cnt>>=1;
x=quick(x,x);
}
return y;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int k;
scanf("%d %d %d %d", &k, &m, &s, &e);
memset(vis,0,sizeof(vis));
node x;
int cnt=1;
for(int i=0; i<m; i++)
{
int w, u, v;
scanf("%d %d %d", &w, &u, &v);
if(!vis[u]) vis[u]=cnt++;
if(!vis[v]) vis[v]=cnt++;
u=vis[u],v=vis[v];
x.m[u][v]=w,x.m[v][u]=w;
}
n=cnt-1;
x=mul(x,k);
printf("%d\n",x.m[vis[s]][vis[e]]);
}
return 0;
}