最短路题目,dijkstra可解,这里用SPFA解:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAX_VEREXT 1010
int dis[MAX_VEREXT],map[MAX_VEREXT][MAX_VEREXT],visit[MAX_VEREXT],q[MAX_VEREXT],s[MAX_VEREXT],e[MAX_VEREXT];
int vex,arc;
void Init()
{
memset(dis,0x3f,sizeof(dis));
memset(map,0x3f,sizeof(map));
memset(visit,0,sizeof(visit));
memset(q,0,sizeof(q));
memset(s,0,sizeof(s));
memset(e,0,sizeof(e));
}
void Spfa(int s)
{
int front,rear,i,pos;
front=rear=0;
q[rear]=s;
visit[s]=1;//入队
rear++;
dis[s]=0;
while(front<rear)
{
pos=q[front];
front++;
visit[pos]=0;//出队
for(i=1;i<=vex;i++)
{
if(i==pos) continue;
if(dis[i]>dis[pos]+map[pos][i])
{
dis[i]=dis[pos]+map[pos][i];
if(!visit[i])//i未入队
{
visit[i]=1;//i入队
q[rear]=i;
rear++;
}
}
}
}
}
int main()
{
int i,j;
int T,S,D;
int start,end,weight;
int min;
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
Init();
vex=0;
for(i=1;i<=T;i++)
{
scanf("%d%d%d",&start,&end,&weight);
if(map[start][end]>weight) map[start][end]=map[end][start]=weight;
if(start>vex) vex=start;
if(end>vex) vex=end;//寻找最大定点
}
for(i=0;i<S;i++) scanf("%d",&s[i]);
for(i=0;i<D;i++) scanf("%d",&e[i]);
min=INF;
for(i=0;i<S;i++)
{
Spfa(s[i]);
for(j=0;j<D;j++)
{
if(dis[e[j]]<min) min=dis[e[j]];
}
}
printf("%d\n",min);
}
return 0;
}