出门旅行(tour)

出门旅行(tour)

题目描述:

在神奇的 oi 国度,有 n 个城市 m 条双向道路,每条道路连接了两个不同的城市。寒假到了,小 S 决定出门旅游一趟。因为以往跟团旅游多了,这次小 S 决定自驾游。对于自驾游,小 S 最关心的自然是燃油的耗费,为了省钱,小 S 请你帮他找一条最短的路。

输入格式:

第一行两个整数 n,m,表示有 n 个城市和 m 条双向道路。城市从 1..n 编号。
接下来 m 行,每行三个正整数 a,b,c,表示 a 和 b 之间有一条长为 c 的双向道路。a,b 不相同,且 c 不超过 1000
注意:两个城市之间可能会有多条双向道路。
接下来一行两个整数,s,t,表示小 S 本次旅行的出发地和目的地。s,t 不相同。

输出格式:

仅一行一个整数,表示最短的距离。如果不能到达,请输出-1。

样例输入:

3 3
1 2 1
1 3 3
2 3 1
1 3

样例输出:

2

提示:

【样例解释】
1->2->3 即是最优解。
【数据范围】
对于 30%的数据,n<=100,m<=1000
对于 100%的数据,n<=2000,m<=100000

时间限制:1000ms
空间限制:128MByte

#include<bits/stdc++.h>
using namespace std;
int n, m;
struct enode{
    int y, z;
    enode(int y1, int z1) : y(y1), z(z1) {}
};

struct node{
    int dis, v;
    node(int x1, int y1) : dis(x1), v(y1) {}
    bool operator < (const node &a) const
    {
        return dis > a.dis;
    }
};

vector<enode> e[200005];
priority_queue<node> q;
int dis[2005];
bool vis[2005];

int main()
{
    int x, y, z, s, t, v;
    cin>>n>>m;
    for(int i = 1; i <= m; i++){
        cin>>x>>y>>z;
        e[x].push_back(enode(y, z));
        e[y].push_back(enode(x, z));
    }
    memset(dis, 0x3f3f3f3f, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    cin>>s>>t;
    dis[s] = 0;
    q.push(node(0, s));
    while(!q.empty()){
        v = q.top().v;
        q.pop();
        if(vis[v]) continue;
        vis[v] = 1;
        for(int i = 0; i < e[v].size(); i++)
            if(dis[v] + e[v][i].z < dis[e[v][i].y]){
                dis[e[v][i].y] = dis[v] + e[v][i].z;
                q.push(node(dis[e[v][i].y], e[v][i].y));
            }
    }
    if(dis[t] == 0x3f3f3f3f) cout<<-1<<endl;
    else cout<<dis[t]<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/abs27/p/9299272.html
今日推荐