码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2680 Choose the best route

时间:2015-08-25 20:57:55      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

测试数据意思:

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

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

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

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

 

#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;
}

 

HDU2680 Choose the best route

标签:

原文地址:http://www.cnblogs.com/d-e-v-i-l/p/4758300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!