poj 2394 最短路

来源:互联网 发布:海关进口数据怎么查询 编辑:程序博客网 时间:2024/04/27 15:57

传送门

题意:略。

思路:最短路水题。

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>#define maxn 1<<29using 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;}