#include<iostream>
#include<string.h>
#include<stdio.h>
#include<string>
using namespace std;
#define M 1010
int maxData=10000000;
int graph[M][M];
int d[M]; //储存个点到源点的路径长度
int pre[M]; //存储节点前驱
bool final[M]; //标志位
int t,n;
void Dij(int src)
{
int i,j;
int minData;
int v;
memset(final,0,sizeof(final));
for(i=1;i<=n;++i)
{
d[i] = graph[src][i];//将源点一列的所有点存入d[]中
if(d[i]<maxData)
pre[i]=src;//找到其前驱
else
pre[i]=0;
}
final[src]=true;
d[src]=0;//自己到自己的距离为0
for(i=1;i<n;++i)
{
minData = maxData;
for(j=1;j<=n;++j)
{
if(!final[j] && d[j]<minData)//找最小值
{
v = j;
minData=d[j];
}
}
final[v]=true;
for(j=1;j<=n;++j)
{
if(!final[j] && graph[v][j]<maxData && d[j]>d[v]+graph[v][j])
{
d[j]=d[v]+graph[v][j];//更新到源点的值
pre[j]=v; //前驱节点更新
}
}
}
}
int main()
{
int i,j;
int start,end,cost;
int T;
cin>>T;
while(T--)
{
int N,Q,arm[101];
cin>>N>>n>>t>>Q;
for(i=0;i<N;i++)
cin>>arm[i];
for(i=1;i<=n;++i) //此处别忘了进行初始化临界矩阵为无穷大
{
for(j=1;j<=n;++j)
{
graph[i][j]=maxData;
}
}
for(i=1;i<=t;++i)
{
cin>>start>>end>>cost;
if(cost<graph[start][end]) //如果存在重边,找最小值
{
graph[start][end]=cost;
graph[end][start]=cost;
}
}
Dij(Q);
int temp=maxData;
for(i=0;i<N;i++)
if(temp>d[arm[i]])
temp=d[arm[i]];
printf("%d\n",temp);
}
return 0;
}
nyoj115城市平乱
最新推荐文章于 2018-05-06 16:59:42 发布