题意:略。
思路:最短路水题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define maxn 1<<29
using namespace std;
int n,m,c,t;
int fst[505],next[300000],node[300000],l[300000];
int d[505],ans[505],num,en;
bool inq[505];
void add(int u,int v,int ll)
{
next[en]=fst[u];
fst[u]=en;
node[en]=v;
l[en]=ll;
en++;
}
void spfa()
{
for(int i=1;i<=n;i++)
{
d[i]=maxn;
}
d[1]=0;
memset(inq,0,sizeof(inq));
queue<int>q;
q.push(1);
inq[1]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u]=0;
for(int i=fst[u];i!=-1;i=next[i])
{
int v=node[i];
if(d[v]>d[u]+l[i])
{
d[v]=d[u]+l[i];
if(!inq[v])
{
q.push(v);
inq[v]=1;
}
}
}
}
}
int main()
{
int u,v,ll;
en=0;
memset(fst,-1,sizeof(fst));
scanf("%d%d%d%d",&n,&m,&c,&t);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&ll);
add(u,v,ll);
add(v,u,ll);
}
spfa();
num=0;
for(int i=1;i<=c;i++)
{
scanf("%d",&u);
if(d[u]<=t)ans[num++]=i;
}
cout<<num<<endl;
for(int i=0;i<num;i++)cout<<ans[i]<<endl;
return 0;
}