dijkstra算法,本题的技巧在于设置一个起点与S相连,设置一个终点与D相连,于是题目就变成了从起点到终点的最短距离了。
for(int i=0;i
for(int j=0;j
if(i==j)
Map[i][j]=0;
else
Map[i][j]=Inlimit;
}
int i,j,w,minc,mark[N];
for (i=0;i<=n;i++)
{
if(i==s){
mark[s]=1;D[s]=0;
}
else
{
D[i]=Map[s][i];
mark[i]=0;
}
}
for (i=1;i<=n;i++)
{
minc=Inlimit;
w=s;
for (j=1;j<=n;j++)
if (!mark[j]&&minc>D[j]) {minc=D[j];w=j;}
mark[w]=1;
for (j=0;j<=n;j++)
if (!mark[j]&&(D[j]>D[w]+Map[w][j]))D[j]=D[w]+Map[w][j];
}
return D[t];
int t,s,d;
while(scanf("%d%d%d",&t,&s,&d)!=EOF){
initi();
int a,b,time;
n=0;
while(t--){
scanf("%d%d%d",&a,&b,&time);
if(Map[a][b]>time)//因为a,b有多条路
Map[a][b]=Map[b][a]=time;
if(a>n)n=a;
if(b>n)n=b;
}
++n;
int x,y;
while(s--){
scanf("%d",&x);
Map[0][x]=Map[x][0]=0;//0与出发点相连
}
while(d--){
scanf("%d",&x);
Map[n][x]=Map[x][n]=0;//终点与n相连
}
printf("%d\n",Dijkstra(0,n));
}
#include"stdio.h"
#define Inlimit 0xfffff
#define N 1005
int n,D[N],S[N],Map[N][N];
void initi()
{
}
int Dijkstra(int s,int t)
{
}
int main()
{
}