美文网首页编程练习
HDOJ 2066 (多源多汇最短路)

HDOJ 2066 (多源多汇最短路)

作者: codinRay | 来源:发表于2017-04-14 17:02 被阅读0次

http://acm.hdu.edu.cn/showproblem.php?pid=2066

题意:
最短路问题,有多个源头和多个去向。
解法是把全部的源点压缩成一个点,再跑最短路。

Hint:

  • 每次输入数据,记得把邻接表数据清空。
  • 邻接表存图无需判断重边。
#include <iostream>
#include <algorithm>
#include <functional>
#include <queue>
#include <vector>
using namespace std;
const int
INF = 0x3f3f3f3f, MAXV = 1005, MAXE = 1005;
typedef pair<int, int> pr;

struct edge {
    int to, w;
};
int v, e, near, want;
int d[MAXV];
vector<vector<edge> > lj(MAXV);

edge Edge(int t, int w) {
    edge ret;
    ret.to = t;
    ret.w = w;
    return ret;
}
void Dijkstra(int s) {
    priority_queue<pr, vector<pr>, greater<pr> > q;
    fill(d + 1, d + v + 1, INF);
    d[s] = 0;
    q.push(pr(s, 0));

    while (!q.empty()) {
        pr tv = q.top();
        q.pop();
        int vNo = tv.first;
        if (d[vNo] < tv.second)
            continue;
        for (edge E : lj[vNo]) {
            if (d[E.to] > d[vNo] + E.w) {
                d[E.to] = d[vNo] + E.w;
                q.push(pr(E.to, d[E.to]));
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(false);

    while (cin >> e >> near >> want) {
        for (int i = 0; i < MAXV; ++i)
            lj[i].clear();
        vector<int>
            start(near + 1), end(want + 1);
        int maxV = 0;
        for (int i = 1; i <= e; ++i) {
            int f, t, c;
            cin >> f >> t >> c;
            int curMax = max(f, t);
            maxV = max(maxV, curMax);
            lj[f].push_back(Edge(t, c));
            lj[t].push_back(Edge(f, c));
        }
        v = maxV;
        for (int i = 1; i <= near; ++i) {
            cin >> start[i];
            lj[0].push_back(Edge(start[i],0)); // 把所有源点统一到0即从0向start[i]连边
        }
        for (int i = 1; i <= want; ++i) {
            cin >> end[i];
        }
        int minT = INF;
        Dijkstra(0);
        for (int i = 1; i <= want; ++i) {
            minT = min(d[end[i]], minT);
        }
        cout << minT << endl;
    }
    return 0;
}

相关文章

  • HDOJ 2066 (多源多汇最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=2066 题意:最短路问题,有...

  • 遍历 最短路径 1.单源最短路 有权图-Dijkstra 多源头最短路-Floyd算法 —————————————...

  • 最短路径算法

    最短路径算法可以分为两类:单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任...

  • 第七讲-图(中)

    最短路径 问题分类:单源,多源 无权图的单源最短路径用bfs就可以解决。按照递增(非递减)的顺序找出从源到各个定点...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

  • 🤙🤙🤙弗洛伊德算法精讲(Floyd),三分钟包会,只要999。

    题目如下⬇多源最短路 ** 时间限制: 1 s ** 空间限制: 128000 KB 题目描述 Descripti...

  • [codevs]1077 多源最短路 --- Floyd

    题目描述 Description已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点...

  • 多源最短路径 Floyd算法

    Floyd算法是解决多源最短路径的算法,优点是简单易于理解。主要流程如下: 1 初始化矩阵初始值 2 遍历每一个节...

  • HDOJ 2544 最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=2544 题面:最短路裸题。 ...

  • floyd

    佛洛依德算法: 多源最短路径算法 三人for循环 领接矩阵 一个存最短路径权 一个存路径 逐个顶点试探,加...

网友评论

    本文标题:HDOJ 2066 (多源多汇最短路)

    本文链接:https://www.haomeiwen.com/subject/mjxgattx.html