hdu 4725 The Shortest Path in Nya Graph(建图+优先队列dijstra)

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

题意:有n个点和n层,m条边,每一层的任意一个点都可以花费固定的值到下一层或者上一层的任意点

然后m条边链接的点可以花费给出的值进行转移,最后问从i点到n点最少要花费多少。

这题点的个数有100000,层数也是100000,不算额外边暴力建边肯定要爆。

所以可以把层数也当成一个点比如说i点在j层于是n+j就与i链接花费0然后i点可以和上下层任意一个点链接

及i与n+j+1链接i与n+j-1链接花费为c,最后额外边就正常处理。

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stdio.h>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 1e5 + 10;
int n , m , c , u , v , w , l , pos[M << 1] , dis[M << 1];
struct qnode {
    int v , w;
    qnode(int v , int w):v(v) , w(w) {

    }
    bool operator <(const qnode &r) const{
        return w > r.w;
    }
};
struct TnT {
    int v , w , next;
    TnT(int v , int w):v(v) , w(w) {

    }
};
vector<TnT> vc[M << 1];
void add(int u , int v , int w) {
    vc[u].push_back(TnT(v , w));
}
bool vis[M << 1];
void dij(int sta) {
    priority_queue<qnode>q;
    for(int i = 1 ; i <= 2 * n ; i++) {
        dis[i] = inf;
        vis[i] = false;
    }
    dis[sta] = 0;
    q.push(qnode(sta , 0));
    while(!q.empty()) {
        int u = q.top().v;
        q.pop();
        if(vis[u])
            continue;
        vis[u] = true;
        for(int i = 0 ; i < vc[u].size() ; i++) {
            TnT gg = vc[u][i];
            if(dis[gg.v] > dis[u] + gg.w && !vis[gg.v]) {
                dis[gg.v] = dis[u] + gg.w;
                q.push(qnode(gg.v , dis[gg.v]));
            }
        }
    }
}
int main() {
    int t , ans = 0;
    scanf("%d" , &t);
    while(t--) {
        ans++;
        scanf("%d%d%d" , &n , &m , &c);
        for(int i = 1 ; i <= 2 * n ; i++) {

            vc[i].clear();
        }
        for(int i = 1 ; i <= n ; i++) {
            vis[i] = false;
        }
        for(int i = 1 ; i <= n ; i++) {
            scanf("%d" , &l);
            pos[i] = l;
            vis[l] = true;
        }
        for(int i = 1 ; i <= n ; i++) {
            if(pos[i] == 1) {
                add(pos[i] + n , i , 0);
                if(n > 1 && vis[pos[i] + 1]) {
                    add(i , pos[i] + 1 + n , c);
                }
            }
            else if(pos[i] == n) {
                add(pos[i] + n , i , 0);
                if(n > 1 && vis[pos[i] - 1]) {
                    add(i , pos[i] - 1 + n , c);
                }
            }
            else {
                add(pos[i] + n , i , 0);
                if(1 < n && vis[pos[i] + 1]) {
                    add(i , pos[i] + 1 + n , c);
                }
                if(n > 1 && vis[pos[i] - 1]) {
                    add(i , pos[i] - 1 + n , c);
                }
            }
        }
        for(int i = 1 ; i <= m ; i++) {
            scanf("%d%d%d" , &u , &v , &w);
            add(u , v , w);
            add(v , u , w);
        }
        dij(1);
        if(dis[n] == inf)
            dis[n] = -1;
        printf("Case #%d: %d\n" , ans , dis[n]);
    }
    return 0;
}
时间: 2024-10-23 10:34:14

hdu 4725 The Shortest Path in Nya Graph(建图+优先队列dijstra)的相关文章

HDU 4725 The Shortest Path in Nya Graph(构图)

The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13445    Accepted Submission(s): 2856 Problem Description This is a very easy problem, your task is just calculate

The Shortest Path in Nya Graph HDU - 4725

Problem Description This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just move on.The Nya graph is an un

HDU4725 The Shortest Path in Nya Graph(堆优化的dijkstra算法)

题意: 这是一个非常容易解决的问题,您的任务只是计算图像,而仅是计算干草成本和算法成本.如果您不懂此段话,请继续.Nya图是具有“层”的无向图.图中的每个节点都属于一个层,总共有N个节点.您可以以成本C从x层中的任何节点移动到x + 1层中的任何节点,因为道路是双向的,因此也可以以相同的成本从x + 1层移动到x层.此外,还有M个额外的边,每个边连接一对节点u和v,成本为w.帮助我们计算从节点1到节点N的最短路径. 题解: 主要是建图. N个点,然后有N层,要假如2*N个点. 总共是3*N个点.

HDU - 4725 (The Shortest Path in Nya Graph)层次网络

题意:有n个点,每个点都在一个层内,层与层之间的距离为c,一个层内的点可以到达与它相邻的前后两个层的点,还有m条小路 ..时间真的是卡的很恶心啊... 借一下别人的思路思路: 这题主要难在建图上,要将层抽象出来成为n个点(对应编号依次为n+1~n+n),然后层与层建边,点与点建边,层与在该层上的点建边(边长为0),点与相邻层建边(边长为c). ps:这样处理就不用拆点了.不过要注意的是相邻两层必须都要有点才建边(不然会WA,可以参考我贴的数据) 借鉴自:http://www.myexceptio

HDU 4370 0 or 1(spfa+思维建图+计算最小环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 题目大意:有一个n*n的矩阵Cij(1<=i,j<=n),要找到矩阵Xij(i<=1,j<=n)满足以下条件: 1.X 12+X 13+...X 1n=1  2.X 1n+X 2n+...X n-1n=1  3.for each i (1<i<n), satisfies ∑X ki (1<=k<=n)=∑X ij (1<=j<=n). 举个例子

HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)

http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则:投票具有传递性,A支持B,B支持C,那么C获得2票(A.B共两票),输出最多能获得的票数是多少张和获得最多票数的人是谁? 思路: 先强连通缩点反向建图,在计算强连通的时候,需要保存每个连通分支的结点个数. 为什么要反向建图呢?因为要寻找票数最多的,那么肯定是入度为0的点,然后dfs计算它的子节点的

VJ - H - Almost the shortest route - 图论(反向建图)

https://vjudge.net/contest/351913#problem/H N cities (2 ≤ N ≤ 10 000 ) are connected by a network of M one-way roads (1 ≤ M < 100 000 000 ). It is known that these roads do not cross outside the cities. The numeration of the cities and the roads star

HDU 3667-- Transportation【最小费最大流 &amp;&amp; 拆边建图 &amp;&amp; 经典】

Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2441    Accepted Submission(s): 1041 Problem Description There are N cities, and M directed roads connecting them. Now you want to

hdu 4857/BestCoder Round#1 1001(逆向建图)

此题需仔细分析题目,否则题意容易理解错误,应注意下面这种情况 本题意思尽可能让最小的排的靠前,然后次小的尽量靠前,依次下去 如 input: 1 3 1 3 1 output: 3 1 2 解析:我们应让1尽可能的排在前面,然后尽可能的让2排的靠前...所以 2 3 1的结果是错误的 思路:拓扑排序(逆向建图+队列)//为解决上述列子,如果我们正向建图,每次选择入度为零最小的编号输出则无法满足上述案例: 如果我们尝试逆向建图,每次选择入度为零的最大编号输出则刚刚是正确结果的逆序(省赛并查集的逆用