#include<bits/stdc++.h>
using namespace std;
int dp[1005],V[1005];
int MAP[1005][1005];
const int inf=0x3f3f3f3f;
int minhh(int x,int y)
{
if(x<=y)return x;
else return y;
}
int main()
{
int i,D,S,T,min,minn,a,b,s[1005],d[1005];
while(scanf("%d %d %d",&T,&S,&D)!=EOF)
{
memset(MAP,inf,sizeof(MAP));
for(i=1;i<1005;i++)MAP[i][i]=0;
while(T--)
{
scanf("%d %d %d",&a,&b,&i);
MAP[a][b]=minhh(MAP[a][b],i);
MAP[b][a]=MAP[a][b];
}
for(i=0;i<S;i++)scanf("%d",&s[i]);
for(i=0;i<D;i++)scanf("%d",&d[i]);
//录入题给信息
minn=inf;
for(a=0;a<S;a++)
{
memset(dp,inf,sizeof(dp));
memset(V,-1,sizeof(V));
for(i=1;i<=1000;i++)dp[i]=MAP[s[a]][i];
while(1)
{
dp[1003]=inf;min=1003;T=0;//初始化
for(i=1;i<=1000;i++)
{
if(V[i]==-1&&dp[i]<dp[min])min=i;
}//找出最小边
for(b=0;b<D;b++)if(min==d[b]){T=-1;break;}//多个终点满足其中一个即可
if(T==-1)break;
if(min==1003)break;//所有路径都考虑完了
V[min]=0;//表示这个城市考虑过了
for(i=1;i<=1000;i++)
{
if(V[i]==-1&&dp[i]>dp[min]+MAP[min][i])
dp[i]=dp[min]+MAP[min][i];
}//松弛操作,更新到达每个城市的最短路径
}
minn=minhh(dp[min],minn);
}//考虑不同起点的最短路径,找出最小的
printf("%d\n",minn);
}
return 0;
}
总结
1.上一题的延申,多个起点以及多个终点,都考虑就行
2.memset只有在初始化为0和-1时才能正常执行,比如初始化为1就会出错,原因是memset是按照字节赋值