题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2066
注:wrong了8次。应该是边界情况未处理好。
可借鉴地址(提供了另一种思维方式):http://www.cnblogs.com/heqinghui/archive/2012/11/23/2784297.html
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0xfffffff
using namespace std;
#define N 1001
int w[N][N];
int d[N];
int n;
int visited[N];
int f[N];//记录相邻的城市
int g[N];//记录喜欢到的城市
void dijkstra(int st)
{
int i;
memset(visited,0,sizeof(visited));
for(i=1;i<=n;i++) d[i]=(i==st)?0:INF;
for(i=1;i<=n;i++)
{
int x,m=INF;
for(int j=1;j<=n;j++) if(!visited[j]&&d[j]<m) m=d[x=j];
visited[x]=1;
for(int j=1;j<=n;j++) if(!visited[j]&&w[x][j]!=INF) d[j]=min(d[j],d[x]+w[x][j]);
}
}
int main()
{
int i,j,k,t;
int m;
int u,v;
int l;
while(cin>>m>>l>>t)
{
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
w[i][j]=INF;
n=N-1;
for(i=0;i<m;i++)
{
cin>>u>>v>>k;
if(w[u][v]>k) //可能多条路
{
w[u][v]=k;
w[v][u]=k;
}
//n=max(u,max(v,n)); 换成这句之后就一直在wrong ,应该是边界情况未处理好。
}
int Min=INF;
for(i=0;i<l;i++)
cin>>f[i];
for(i=0;i<t;i++)
cin>>g[i];
for(i=0;i<l;i++)
{
dijkstra(f[i]);
for(j=0;j<t;j++)
if(d[g[j]]<Min) Min=d[g[j]];
}
cout<<Min<<endl;
}
return 0;
}