有 n 个地点,有 m 个条路,以及终点 e
给出 m 条路的起点和终点,以及路费
再给出 q 个起始点,求到达 e 点最小花费
默认起始点为 0 ,利用 dij 求解
const int N=1000+5;
int n,m,t;
int i,j,k;
int d[N];
int f[N][N];
bool vis[N];
void Dijkstra(int s)
{
for(int i=0;i<=n;i++){
d[i]=f[s][i];
vis[i]=0;
}
vis[0]=1;
for(int i=1;i<=n;i++){
int tag=-1,minn=inf;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]<minn){
minn=d[j];
tag=j;
}
}
if(tag==-1) break;
vis[tag]=1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]>d[tag]+f[tag][j])
d[j]=d[tag]+f[tag][j];
}
}
}
int main()
{
//IOS;
int e,s;
while(sddd(n,m,e)==3){
for(i=0;i<=n;i++){
for(j=i;j<=n;j++){
if(i==j) f[i][j]=f[j][i]=0;
else f[i][j]=f[j][i]=inf;
}
}
while(m--){
int u,v,w;
sddd(u,v,w);
f[u][v]=min(f[u][v],w);
}
sd(t);
while(t--){
sd(s);
f[0][s]=0;
}
Dijkstra(0);
if(d[e]==inf) puts("-1");
else pd(d[e]);
}
//PAUSE;
return 0;
}