HDU_2066

    直接用队列优化的Bellman-Ford算法求到各个点的最短路,然后再找到各个想去的地方的最短路的最小值即可。

#include<stdio.h>
#include<string.h>
int q[1010],inq[1010];
int G[1010][1010],d[1010];
int main()
{
int i,j,k,u,v,t,T,S,D,n,ans,front,rear;
while(scanf("%d%d%d",&T,&S,&D)==3)
{
memset(G,0,sizeof(G));
n=0;
for(i=0;i<T;i++)
{
scanf("%d%d%d",&u,&v,&t);
if(!G[u][v]||t<G[u][v])
G[u][v]=G[v][u]=t;
if(u+1>n)
n=u+1;
if(v+1>n)
n=v+1;
}
for(i=0;i<n;i++)
d[i]=1000000000;
front=rear=0;
memset(inq,0,sizeof(inq));
for(i=0;i<S;i++)
{
scanf("%d",&u);
d[u]=0;
q[rear++]=u;
inq[u]=1;
}
while(front!=rear)
{
u=q[front++];
inq[u]=0;
if(front>n)
front=0;
for(v=0;v<n;v++)
if(G[u][v]&&d[u]+G[u][v]<d[v])
{
d[v]=d[u]+G[u][v];
if(!inq[v])
{
q[rear++]=v;
inq[v]=1;
if(rear>n)
rear=0;
}
}
}
ans=1000000000;
for(i=0;i<D;i++)
{
scanf("%d",&t);
if(d[t]<ans)
ans=d[t];
}
printf("%d\n",ans);
}
return 0;
}


posted on 2011-09-23 19:47  Staginner  阅读(258)  评论(0编辑  收藏  举报