FOJ Problem 2261 浪里个浪

                                                                                                                                                           Problem 2261 浪里个浪

Accept: 40    Submit: 106
Time Limit: 1500 mSec    Memory Limit : 32768
KB

Problem Description

TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划。

现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道。他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程。但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗?

Input

包含多组测试数据。

输入第一行包括两个整数n和m,表示有n个地点,m条可行路径。点的编号为1 - n。

接下来m行每行包括三个整数i, j, cost,表示从地点i到地点j需要耗时cost。

接下来一行第一个数为S,表示可能的起点数,之后S个数,表示可能的起点。

接下来一行第一个数为E,表示可能的终点数,之后E个数,表示可能的终点。

0<S, E≤n≤100000,0<m≤100000,0<cost≤100。

Output

输出他需要的最短耗时。

Sample Input

4 4
1 3 1
1 4 2
2 3 3
2 4 4
2 1 2
2 3 4

Sample Output

1

思路:最短路裸模板题。

AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f

struct Edge {
    int from, to, dist;
    Edge(int u = 0, int v = 0, int w = 0) :from(u), to(v), dist(w) {}
};

struct HeapNode {
    int dist, u;  //顶点u距离s的距离为dist
    HeapNode(int w = 0, int x = 0) :dist(w), u(x) {}
    bool operator<(const HeapNode&rhs)const {
        return dist>rhs.dist;
    }
};

struct Graph {
    const static int V = 1e5 + 10+2;
    int n, m;
    vector<Edge>edges;    // 边集
    vector<int>G[V];
    bool done[V];   //是否已经永久标号
    int d[V];     //s到各个顶点的距离

    void init(int n) {
        this->n = n;
        for (int i = 0; i<n; i++)G[i].clear();
        edges.clear();
    }

    void addEdge(int from, int to, int dist) {
        edges.push_back(Edge(from, to, dist));
        m = edges.size();
        G[from].push_back(m - 1);
    }

    void dijkstra(const vector<int>&s) {
        memset(d, 0x3f, sizeof(d));
        memset(done, 0, sizeof(done));
        priority_queue<HeapNode>Q;
        int ns = s.size();
        for (int i = 0; i<ns; i++) {
            d[s[i]] = 0;
            Q.push(HeapNode(0, s[i]));
        }

        while (!Q.empty()) {
            HeapNode x = Q.top(); Q.pop();
            int u = x.u;  // 拿最小距离的顶点编号
            if (done[u])continue;  //每个顶点出发只可以松弛一次
            done[u] = true;
            for (int i = 0; i<G[u].size(); i++) {
                Edge&e = edges[G[u][i]];   //取出一条邻边
                if (d[e.to]>d[u] + e.dist) {
                    d[e.to] = d[u] + e.dist;
                    Q.push(HeapNode(d[e.to], e.to));
                }
            }
        }
    }

    int slove(const vector<int>&s, const vector<int>&t) {
        dijkstra(s);
        int res = inf, nt = t.size();
        for (int i = 0; i<nt; i++) {
            res = min(res, d[t[i]]);
        }
        return res;
    }

}slover;
vector<int>s, t;
int main() {
    //源点0,汇点n+1
    //freopen("in.txt","r",stdin);
    int n, m, u, v, w, S, E;
    while (scanf("%d %d", &n, &m) == 2) {
        slover.init(n + 2);
        s.clear(), t.clear();
        for (int i = 0; i<m; i++) {
            scanf("%d %d %d", &u, &v, &w);
            slover.addEdge(u, v, w);
        }
        s.push_back(0);
        scanf("%d", &S);
        for (int i = 0; i < S; i++) {
            int a;
            scanf("%d",&a);
            slover.addEdge(0,a,0);
        }
        scanf("%d", &E);
        t.resize(E);
        for (int i = 0; i < E; i++) {
            scanf("%d", &t[i]);
        }
        printf("%d\n", slover.slove(s, t));
    };
    return 0;
}
时间: 2024-08-24 03:11:06

FOJ Problem 2261 浪里个浪的相关文章

FZU - 2261 浪里个浪 SPFA最短路

题目 TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划. 现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道.他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程.但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗? Input 包含多组测试数据. 输入第一行包括两个整数n和m,表示有n个地点,m条可行路径.点的编号为1 -

浪里个浪 FZU - 2261

TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划. 现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道.他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程.但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗? Input 包含多组测试数据. 输入第一行包括两个整数n和m,表示有n个地点,m条可行路径.点的编号为1 - n.

[FZU2261]浪里个浪

TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划. 现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道.他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程.但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗? Input 包含多组测试数据. 输入第一行包括两个整数n和m,表示有n个地点,m条可行路径.点的编号为1 - n.

叫我浪里小白龙

我爱学习 学号:211606316 姓名:热爱学习的李震 爱好:打篮球.各种游戏以及学习 最爱吃的菜:4堂麻辣香锅.2堂的云南过桥米线中的沙茶面 #### 一句最想说的话:今天的天气很适合学习呀! 软件工程这个专业对我来说吸引力很大,因为我从小就喜欢玩游戏,从小学1年级玩的射击类游戏<抢滩登陆战>,到后面的策略类游戏<红色警戒>,以及侠盗飞车等等,这些游戏都对我的人生有很大的启发,让我对计算机有了浓厚的兴趣爱好.都说兴趣是最好的老师,所以我就为了我的兴趣选择了软件工程这个专业.过去

FOJ Problem 1016 无归之室

 Problem 1016 无归之室 Accept: 926    Submit: 7502Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 金字塔中有一个房间名叫"无归之室".房间地面完全由相同的矩形瓷砖覆盖.房间里布满无数的机关和陷阱,这正是其名字的由来.考古队花了几年时间研究对策,最后他们想出了一个方案.一台遥控的机器人将被送入房间,解除所有机关,然后返回.为了不触动机关,机器人必须走在瓷砖

FOJ Problem 2257 Saya的小熊饼干

Problem 2257 Saya的小熊饼干 Accept: 23    Submit: 80 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description Saya最近喜欢上了小熊饼干,但是他有非常严重的选择困难症,当然面对这一堆小熊饼干的时候,想起了一句至理名言"犹豫不决么? 那就来RAND()一下吧!". 于是,Saya把小熊饼干排成了一个N*M的矩阵,每个位置上都放着一块小熊饼干.每当他想吃小熊饼干的时

FOJ Problem 2253 Salty Fish

                                                                                                                                                                       Problem 2253 Salty Fish Accept: 35    Submit: 121Time Limit: 1000 mSec    Memory Li

FOJ Problem 2256 迷宫

                                                                                                                                                                           Problem 2256 迷宫 Accept: 25    Submit: 52Time Limit: 1500 mSec    Memory Limit :

FOJ Problem 2254 英语考试

                                                                                                                                                                                    Problem 2254 英语考试 Accept: 36    Submit: 73Time Limit: 1000 mSec    Mem