nyoj-115-城市平乱

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define MAX 999999
using namespace std;
int temp[1010],map[1005][1005],minnum[1005];
bool flag[1005];
int t,n,m,p,q,a,b,c,i,j;
void Dijkstra();
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(map,MAX,sizeof(map));
        memset(flag,0,sizeof(flag));
        memset(minnum,0,sizeof(minnum));
        scanf("%d%d%d%d",&n,&m,&p,&q);
        minnum[q]=0;
        for(i=0;i<n;i++)
            scanf("%d",&temp[i]);
        for(i=0;i<p;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=c;map[b][a]=c;
        }
        Dijkstra();
        int min=MAX;
        for(i=0;i<m;i++)
        {
            if(minnum[temp[i]]<min)
            min=minnum[temp[i]];
        }
        printf("%d\n",min);
    }
    return 0;
}

void Dijkstra()
{
    int min=MAX,l=0;
    for(i=1;i<=m;i++)
    {
        if(!flag[i]&&min>minnum[i])
        {
            min=minnum[i];
            l=i;
        }
    }
    if(l==0)
    return;
    flag[l]=1;
    for(i=1;i<=m;i++)
    {
        if(minnum[l]+map[l][i]<minnum[i]&&!flag[i])
            minnum[i]=minnum[l]+map[l][i];
    }
    Dijkstra();
}

 

posted @ 2013-07-24 19:03  nylg-haozi  阅读(158)  评论(0编辑  收藏  举报