HDU 4725 The Shortest Path in Nya Graph(图论+最短路)

来源:互联网 发布:java开发短信平台 编辑:程序博客网 时间:2024/05/16 00:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725

思路:每一层建一个汇点,汇点连向所有点,然后所有点连向相邻层的汇点,然后图建好后进行dijkstra即可

代码:

#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>using namespace std;#define INF 0x3f3f3f3fconst int EdgeM = 100005 * 10;const int PointN = 100005 * 3;typedef pair<int, int>pii;struct Edge {    int u, v, next;    int value;    Edge() {}    Edge(int u, int v, int value) {this->u = u;this->v = v;this->value = value;    }};struct Graph {    int pn, En, first[PointN];    int a[PointN];    Edge E[EdgeM];    void init(int n) {pn = n; En = 0;memset(first, -1, sizeof(first));    }    //加边,有向bo为0,无向为1     void add(Edge e, int bo) {E[En] = e;E[En].next = first[e.u];first[e.u] = En++;if (bo == 1) {    swap(e.u, e.v);    add(e, 0);}    }    //最短路,优先队列优化的dijkstra    int dijkstra(int s, int e) {memset(a, INF, sizeof(a));priority_queue<pii, vector<pii>, greater<pii> > que;a[s] = 0;que.push(make_pair(a[s], s));while (!que.empty()) {    pii tmp = que.top();    que.pop();    int u = tmp.second;    for (int i = first[u]; i != -1; i = E[i].next) {int v = E[i].v, w = E[i].value;if (a[v] > a[u] + w) {    a[v] = a[u] + w;    que.push(make_pair(a[v], v));}    }}if (a[e] == INF)    return -1;else    return a[e];    }} G;const int N = 100005 * 3;int t, n, m, c, d, vis[N];int main() {    int cas = 0;    scanf("%d", &t);    while (t--) {memset(vis, 0, sizeof(vis));scanf("%d%d%d", &n, &m, &c);G.init(n);for (int i = 1; i <= n; i++) {    scanf("%d", &d);    vis[d] = 1;    G.add(Edge(d + n, i, 0), 0);    if (d > 1)G.add(Edge(i, d + n - 1, c), 0);    if (d < n)G.add(Edge(i, d + n + 1, c), 0);}int u, v, w;while (m--) {    scanf("%d%d%d", &u, &v, &w);    G.add(Edge(u, v, w), 1);}for (int i = 2; i <= n; i++) {    if (vis[i] && vis[i - 1]) {G.add(Edge(i + n, i - 1 + n, c), 1);    }}printf("Case #%d: %d\n", ++cas, G.dijkstra(1, n));    }    return 0;}


1 0
原创粉丝点击