#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int T,N,M,K,A,S,u,v,w,h[1001],k[1001],p[1001][1001],t[1001][1001],d[1001][1001],dis[1001],b[1001][1001],sta[1001];
bool use[1001];
int minx(int N,int dis[])
{
int i;
int n=0;
dis[0]=999999;
for(i=1; i<=N; i++)
if(dis[n]>dis[i]&&!use[i])
{
n=i;
}
return n;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int i,j;
int tt;
int sum;
int mm;
int B;
cin>>T;
int mark[1001];
while(T--)
{
memset(p,0,sizeof(p));
memset(mark,0,sizeof(mark));
memset(t,0,sizeof(t));
memset(d,0,sizeof(d));
//memset(dis,0,sizeof(dis));
memset(b,0,sizeof(b));
memset(sta,0,sizeof(sta));
memset (use,false,sizeof use);
cin>>N>>M>>K>>A>>S;
for(i=0; i<M; i++)
{
cin>>u>>v>>w;
b[u][v]=w;
b[v][u]=w;
}
for(i=1; i<=K; i++)
{
cin>>h[i]>>k[i];
for(j=1; j<=h[i]; j++)
{
cin>>p[i][j];
sta[p[i][j]]=1;
}
for(j=1; j<=h[i]; j++)
{
cin>>d[i][j];
}
for(j=1; j<=k[i]; j++)
{
cin>>t[i][j];
}
}
for(i=1; i<=N; i++)
{
if(i==A)
dis[i]=0;
else
dis[i]=S+1;
}
sum=N;
while(sum--)
{
// cout<<dis[1]<<" "<<dis[2]<<" "<<dis[3]<<" "<<dis[4]<<endl;
B=minx(N,dis);
// cout<<"B"<<B<<endl;
use[B]=true;
for(i=1; i<=N; i++)
{
if(b[B][i]>0&&dis[i]>b[B][i]+dis[B])
{
dis[i]=b[B][i]+dis[B];
// cout<<i<<"==========="<<dis[i]<<endl;
mark[i]=0;
}
}
if(sta[B]==1)
{
for(i=1; i<=K; i++)
{
mm=0;
for(j=1; j<=h[i]; j++)
{
tt=0;mm=mm+d[i][j];
if(p[i][j]==B)
{
if(mark[B]!=i)
for(int n=1; n<=k[i]; n++)
{
if(dis[B]<=mm+t[i][n])
{
tt=t[i][n];
break;
}
}
if(j+1>h[i])
j=0;
if(dis[p[i][j+1]]>mm+tt)
{
dis[p[i][j+1]]=mm+tt;
//cout<<i<<" "<<p[i][j+1]<<"-------------"<<mm+tt<<endl;
mark[p[i][j+1]]=i;
if(j+1==1){mark[p[i][j+1]]=0;}
}
break;
}
}
}
}
}
for(i=1; i<=N; i++)
{
if(dis[i]>S)
cout<<"-1";
else
cout<<dis[i];
if(i<N)
cout<<" ";
else
cout<<endl;
}
}
return 0;
}
最佳路线,最短路径
最新推荐文章于 2021-05-26 00:23:29 发布