题目大意:一个笨蛋要坐车去朋友家,但坐车呕吐,所以想在最短时间内到达。

测试数据意思:

第一行三个数:n(车站的个数,n<1000)  |  m(代表车站之间所有线路的总个数)  | s(代表离朋友家最近的车站)

下面有m行:   p q t   意思是:一条从p到q的线路,花费t时间

m行之后有个数字:w (代表可以在开始时搭乘的车站)

下面w个数W1,W2....Ww就是车站的编号

 dijkstra:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 1e8
struct node
{
    int x,d;
    node(){}
    node(int a,int b){x=a;d=b;}
    bool operator < (const node &a) const
    {
        if(d==a.d) return x<a.x;
        else return d>a.d;
    }
};
vector<node>eg[1005];
int n,m,k,w,dis[1005],a,b,t;
void dijkstra(int x)
{
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    dis[x]=0;
    priority_queue<node>q;
    q.push(node(x,0));
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        for(int i=0;i<eg[x.x].size();i++)
        {
            node y=eg[x.x][i];
            if(dis[y.x]>x.d+y.d)
            {
                dis[y.x]=x.d+y.d;
                q.push(node(y.x,dis[y.x]));
            }
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(int i=1;i<=n;i++)
            eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&t);
            eg[b].push_back(node(a,t));
        }
        dijkstra(k);
        scanf("%d",&w);
        int ans=inf;
        while(w--)
        {
            scanf("%d",&a);
            if(dis[a]<ans) ans=dis[a];
        }
        if(ans<inf) printf("%d\n",ans);
        else printf("-1\n");
    }
    return 0;
}

 spfa:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 1e8
struct node
{
    int x,s;
    node(int a,int b){x=a;s=b;}
};
vector<node>eg[1005];
int n,m,k,a,b,s,dis[1005];
bool vis[1005];
void spfa(int x)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    dis[x]=0;
    vis[x]=true;
    queue<int>q;
    q.push(x);
    while(!q.empty())
    {
        int y=q.front();
        q.pop();
        vis[y]=false;
        for(int i=0;i<eg[y].size();i++)
        {
            int p=eg[y][i].x,s=eg[y][i].s;
            if(dis[p]>dis[y]+s)
            {
                dis[p]=dis[y]+s;
                if(vis[p]==false)
                {
                    vis[p]=true;
                    q.push(p);
                }
            }
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(int i=1;i<=n;i++)
            eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&s);
            eg[b].push_back(node(a,s));
        }
        spfa(k);
        int ans=inf;
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d",&a);
            if(ans>dis[a]) ans=dis[a];
        }
        if(ans<inf) printf("%d\n",ans);
        else printf("-1\n");
    }
    return 0;
}