#include"iostream"
using namespace std;
const int vexnum=1005;
const int maxl=999999;
void dijkstra(int n,int v,int *dist,int c[][vexnum]) //算法自己理解
{
int s[vexnum]={0};
int i,j;
for(i=1;i<=n;i++)
dist[i]=c[v][i];
dist[v]=0;
s[v]=1;
for(i=2;i<=n;i++)
{
int temp=maxl;
int u=v;
for(j=1;j<=n;j++)
{
if(!s[j]&&dist[j]<temp)
{
u=j;
temp=dist[j];
}
}
s[u]=1;
for(j=1;j<=n;j++)
{
if(!s[j]&&c[u][j]<maxl)
{
int newdist=dist[u]+c[u][j];
if(newdist<dist[j])
dist[j]=newdist;
}
}
}
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,S,D;
int c[vexnum][vexnum]; //保存两点之间的时间
int dist[vexnum]; //从源点到当前点的时间
int startcity[vexnum]; //起点
int endcity[vexnum]; //终点
while(cin>>T>>S>>D)
{
int i,j;
for(i=0;i<vexnum;i++) //初始化
{
for(j=0;j<vexnum;j++)
{
//if(i!=j) //当一条边起点终点相同时,长度为0 可加可去;
c[i][j]=maxl;
//else
//c[i][j]=0;
}
dist[i]=maxl;
}
int s,t,len,maxn=0;
for(i=0;i<T;i++)
{
cin>>s>>t>>len;
if(c[s][t]>len) //重中之重不可去
c[s][t]=c[t][s]=len;
if(maxn<max(s,t))
maxn=max(s,t);
}
for(i=0;i<S;i++) //输入起点
cin>>startcity[i];
for(i=0;i<D;i++) //输入终点
cin>>endcity[i];
int mint=maxl; //设最小值为999999
for(i=0;i<S;i++) //选定一个起点然后用dijkstra算法算出从这个点到各个点的最短路径
{
dijkstra(maxn,startcity[i],dist,c);
for(j=0;j<D;j++)
if(dist[endcity[j]]<mint)
mint=dist[endcity[j]];
}
cout<<mint<<endl;
}
return 0;
}
hdoj2066
最新推荐文章于 2018-07-19 10:35:04 发布