#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int a,b,m,l,k;
int G[160][160],d[160][15];
int vis[160][20];
void init(){
for(int i=1;i<=a+b;i++)
for(int j=1;j<=a+b;j++)
if(i==j)
G[i][j]=0;
else
G[i][j]=INF;
}
void floyd(){
for(int k=1;k<=a;k++){
for(int i=1;i<=a+b;i++){
for(int j=1;j<=a+b;j++){
if(k == i || k == j) continue;
if(G[i][k]+G[k][j]<G[i][j])
G[i][j]=G[i][k]+G[k][j];
}
}
}
}
struct node{
int u,k;
}q[100000];
void spfa()
{
int maxn=(k+1)*(a+b);
int front=0,rear=0;
memset(vis,0,sizeof(vis));
for (int i=1;i<=a+b;i++)
{
for (int j=0;j<=k;j++)
{
d[i][j]=INF;
}
}
for(int i=0;i<=k;i++)
d[a+b][i]=0;
d[a+b][0]=0
q[0].u=a+b;
q[0].k=0;
rear++;
while (front!=rear)
{
int u=q[front].u;
int k1=q[front].k;
front++;
if (front>maxn)
front=0;
vis[u][k1]=0;
for (int i=1;i<=a+b;i++)
{
if (d[i][k1]>d[u][k1]+G[u][i])
{
d[i][k1]=d[u][k1]+G[u][i];
if (!vis[i][k1])
{
q[rear].u=i;
q[rear].k=k1;
rear++;
if (rear>maxn)
rear=0;
vis[i][k1]=1;
}
}
if (G[u][i]<=l && k1<k && d[u][k1]<d[i][k1+1])
{
d[i][k1+1]=d[u][k1];
if (!vis[i][k1+1])
{
vis[i][k1+1]=1;
q[rear].u=i;
q[rear].k=k1+1;
rear++;
if (rear>maxn)
rear=0;
}
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d%d",&a,&b,&m,&l,&k);
init();
for(int i=0;i<m;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
G[u][v]=G[v][u]=c;
}
floyd();
spfa();
int res=INF;
for(int i=0;i<=k;i++){
if(d[1][i]<res)
res=d[1][i];
}
printf("%d\n",res);
}
}
uva 10269 最短路变形
最新推荐文章于 2021-04-28 15:49:23 发布