题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
#include <stdio.h>
#include <string.h>
#define MAX 1005
#define INF 1000000
int map[MAX][MAX];
int dist[MAX],visit[MAX];
int from[MAX],destination[MAX];
int snum,dnum;
int Max(int x,int y)
{
return x>y?x:y;
}
int Dijkstra(int s,int n)
{
int i,j,min,v;
for(i=1;i<=n;i++)
{
dist[i]=map[s][i];
visit[i]=0;
}
dist[s]=0;
visit[s]=1;
for(i=1;i<=n;i++)
{
min=MAX;
v=1;
for (j=1;j<=n;j++)
{
if(!visit[j]&&dist[j]<min)
{
min=dist[j];
v=j;
}
}
visit[v]=1;
if(min==INF)
break;
for(j=1;j<=n;j++)
if(!visit[j]&&dist[j]>(dist[v]+map[v][j]))
dist[j]=dist[v]+map[v][j];
}
min=INF;
for(i=1;i<=dnum;++i)
{
if(min>dist[destination[i]])
min=dist[destination[i]];
}
return min;
}
int main()
{
int n,tnum,a,b,time,i,j,ans;
while(scanf("%d %d %d",&tnum,&snum,&dnum)!=EOF)
{
n=0;
//memset(map,INF,sizeof(map));//错误
for(i=0;i<MAX;++i)
{
for(j=0;j<MAX;++j)
map[i][j]=INF;
}
for(i=1;i<=tnum;++i)
{
scanf("%d %d %d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
n=Max(n,Max(a,b));
}
for(i=1;i<=snum;++i)
{
scanf("%d",&from[i]);
}
for(i=1;i<=dnum;++i)
{
scanf("%d",&destination[i]);
}
ans=INF;
for(i=1;i<=snum;++i)
{
a=Dijkstra(from[i],n);
if(ans>a)
ans=a;
}
printf("%d\n",ans);
}
return 0;
}
/*大师的佳作*/
#include <stdio.h>
const int N=1002,oo=1000000000;
int a[N][N],n,t,s,d;
void init()
{
int x,y,z,i,j;
for (i=0;i<N;i++)
for (j=0;j<N;j++) a[i][j]=oo;
n=0;
for (i=1;i<=t;i++)
{
scanf("%d%d%d",&x,&y,&z);
if (z<a[x][y]) a[y][x]=a[x][y]=z;
if (x>n) n=x;
if (y>n) n=y;
}
n++;
for (i=1;i<=s;i++) {scanf("%d",&x); a[0][x]=0;}//相邻点置为0
for (i=1;i<=d;i++) {scanf("%d",&x); a[x][n]=0;}//好好体会,相当于改变了终点
}
void dijkstra()
{
int min,p,v[N]={0},i,j;
for (j=1;j<=n;j++)
{
min=oo;
for (i=1;i<=n;i++)
if (a[0][i]<min && !v[i])
{
min=a[0][i];
p=i;
}
v[p]=1;
for (i=1;i<=n;i++)
if (a[0][p]+a[p][i]<a[0][i])
a[0][i]=a[0][p]+a[p][i];
}
}
void main()
{
while (scanf("%d%d%d",&t,&s,&d)!=EOF)
{
init();
dijkstra();
printf("%d\n",a[0][n]);
}
}