裸的最短路徑,實在太水了,不過1Y也是不容易的
還是少刷點水題吧
/*
ID: daniel.20
LANG: JAVA
TASK: fence8
*/
import java.io.*;
import java.math.BigInteger;
import java.util.*;
class problem{
int f,p,c,m;
int cow[];
int g[][];
void solver() throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(reader.readLine());
f = Integer.valueOf(st.nextToken());
p = Integer.valueOf(st.nextToken());
c = Integer.valueOf(st.nextToken());
m = Integer.valueOf(st.nextToken());
cow = new int[c];
g = new int[f+1][f+1];
for(int i=0;i<f+1;i++)
Arrays.fill(g[i], Integer.MAX_VALUE);
for(int i=0;i<p;i++){
st = new StringTokenizer(reader.readLine());
int from = Integer.valueOf(st.nextToken());
int to = Integer.valueOf(st.nextToken());
int len = Integer.valueOf(st.nextToken());
if(g[from][to]>len) g[from][to]=len;
if(g[to][from]>len) g[to][from]=len;
}
for(int i=0;i<c;i++){
cow[i]=Integer.valueOf(reader.readLine());
}
dijkstra();
}
void dijkstra(){
boolean vis[] = new boolean[f+1];
int dis[] = new int[f+1];
Arrays.fill(dis, 999999999);
dis[1]=0;
for(int i=0;i<f;i++){
int min = 999999999;
int min_node = -1;
for(int j=1;j<=f;j++){
if(!vis[j]&&dis[j]<min){
min=dis[j];min_node=j;
}
}
if(min_node==-1) break;
vis[min_node]=true;
for(int j=1;j<=f;j++){
if(g[min_node][j]!=Integer.MAX_VALUE&&dis[j]>dis[min_node]+g[min_node][j]){
dis[j]=dis[min_node]+g[min_node][j];
}
}
}
int count=0;
StringBuilder sb= new StringBuilder();
for(int i=0;i<c;i++){
if(dis[cow[i]]<=m){
count++; sb.append(i+1).append("\n");
}
}
System.out.println(count);
System.out.println(sb.toString());
}
}
public class fence8 {
public static void main (String [] args) throws Exception {
problem p = new problem();
p.solver();
}
}