2680
wr:
#include<bits/stdc++.h>
using namespace std;
#define M 1010
#define INF 0xfffffff
int pri[M][M],dis[M],v[M];
int n,m,s;
void Dijkstra(){
int i,j,k;
memset(v,0,sizeof(v));//赋初值为0
for(i=1; i<=n; i++)//反向建图
dis[i] = pri[0][i];
for(i=1; i<=n; i++){
int min = INF;
k = 0;
for(j=1; j<=n; j++)
if(!v[j] && dis[j] < min){
min = dis[j];
k = j;
}
if(k == 0)return;
v[k] = 1;//标记
for(j=1; j<=n; j++){
if(!v[j] && dis[k] + pri[k][j] < dis[j])
dis[j] = dis[k] + pri[k][j];
}
}
}
int main(){
int i,j;
while(scanf("%d%d%d",&n,&m,&s) != EOF){
for(i=0; i<=n; i++){
for(j=0; j<=n; j++)
pri[i][j] = INF;
pri[i][i] = 0;
}
int p,q,t;
for(i=0; i<m; i++){
scanf("%d%d%d",&p,&q,&t);
if(t < pri[p][q])
pri[p][q] = t;
}
int w,x;
scanf("%d",&w);
for(i=0; i<w; i++){
scanf("%d",&x);
pri[0][x] = 0;
}
Dijkstra();
if(dis[s] != pri[0][s]) printf("1\n");
else printf("-1\n");
}
return 0;
}
ac:
#include<bits/stdc++.h>
using namespace std;
#define M 1010
#define INF 0xfffffff
int pri[M][M],dis[M],v[M];
int n,m,s;
void Dijkstra(){
int i,j,k;
memset(v,0,sizeof(v));//赋初值为0
for(i=1; i<=n; i++)//反向建图
dis[i] = pri[0][i];
for(i=1; i<=n; i++){
int min = INF;
k = 0;
for(j=1; j<=n; j++)
if(!v[j] && dis[j] < min){
min = dis[j];
k = j;
}
if(k == 0)return;
v[k] = 1;//标记
for(j=1; j<=n; j++){
if(!v[j] && dis[k] + pri[k][j] < dis[j])
dis[j] = dis[k] + pri[k][j];
}
}
}
int main(){
int i,j;
while(scanf("%d%d%d",&n,&m,&s) != EOF){
for(i=0; i<=n; i++){
for(j=0; j<=n; j++)
pri[i][j] = INF;
pri[i][i] = 0;
}
int p,q,t;
for(i=0; i<m; i++){
scanf("%d%d%d",&p,&q,&t);
if(t < pri[p][q])
pri[p][q] = t;
}
int w,x;
scanf("%d",&w);
for(i=0; i<w; i++){
scanf("%d",&x);
pri[0][x] = 0;
}
Dijkstra();
if(dis[s] != pri[0][s]) printf("%d\n",dis[s]);
else printf("-1\n");
}
return 0;
}