起点成市有多个,抵达城市也有多个,问当中最最最短的是哪一条。每一种情况都得考虑,有n*m种情况。这是加强版的最短路径问题。题目不难,需要耐心。
以下是AC代码,没怎么优化。请耐心看。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAX 1005
#define inf 99999
int len,e;
int map[MAX][MAX],ee[MAX];
int dis[MAX],flag[MAX];
int dj(int str)//以下是模板,不用多解释
{
int i,j,v,minx;
//memset(flag,0,sizeof(flag));
for(i=1; i<=len; i++)
{
flag[i]=0;
dis[i]=map[str][i];
}
dis[str]=0;
flag[str]=1;
for(i=1; i<=len; i++)
{
minx=inf;
for(j=1; j<=len; j++)
{
if(!flag[j]&&dis[j]<minx)
{
minx=dis[j];
v=j;
}
}
flag[v]=1;
if(minx==inf)break;
for(j=1; j<=len; j++)
{
if(!flag[j]&&dis[j]>dis[v]+map[v][j])
dis[j]=dis[v]+map[v][j];
}
}
minx=inf;
for(i=1; i<=e; i++)//起始城市到每个想去城市的最短距离,找出最小的
{
if(minx>dis[ee[i]])
minx=dis[ee[i]];
}
return minx;
}
int main()
{
int t,s,i,j,a,b,time,ans,minx;
int ss[MAX];
while(scanf("%d%d%d",&t,&s,&e)!=EOF)
{
for(i=1; i<=MAX; i++)
for(j=1; j<=MAX; j++)
map[i][j]=inf;
len=0;//记录城市的长度(最大是几号城市)
while(t--)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
if(len<a)len=a;
if(len<b)len=b;
}
for(i=1; i<=s; i++)
scanf("%d",&ss[i]);
for(i=1; i<=e; i++)
scanf("%d",&ee[i]);
ans=inf;
for(i=1; i<=s; i++)//列举每一个起始城市
{
minx=dj(ss[i])
if(ans>minx)
ans=minx;
}
cout<<ans<<endl;
}
return 0;
}