HDU - 4396 More lumber is required (BFS 最短路)

题目大意:有一个需要采集K跟木头,然后到达点T,现在他从S点出发,路上有N个节点,M条边,只要经过1条边,就可以得到10根木头,问需要花费多少时间才能完成任务

解题思路:木头最多只有500根,且每次收集10跟,最多也只需要收集50次就可以,而且节点最多只有5000个,所以直接暴力BFS即可

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define N 5010
#define M 200010

struct Edgs{
    int to, next, dis;
}E[M];

struct Node{
    int pos, time, wood;
    Node(int pos, int time, int wood): pos(pos), time(time), wood(wood) {}
    bool operator < (const Node &b) const {
        return time > b.time;
    }
};

int n, m, cnt, S, T, K, head[N];
int dp[N][60];

void add_edgs(int u, int v, int l) {
    E[cnt].to = v;
    E[cnt].dis = l;
    E[cnt].next = head[u];
    head[u] = cnt++;
}

void init() {
    memset(head, -1, sizeof(head));
    cnt = 0;

    int x, y, z;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &x, &y, &z);
        add_edgs(x, y, z);
        add_edgs(y, x, z);
    }
}

int bfs() {
    memset(dp, 0x3f, sizeof(dp));
    priority_queue<Node> q;
    q.push(Node(S, 0, 0));
    dp[S][0] = 0;

    while (!q.empty()) {
        Node t = q.top();
        q.pop();
        int u = t.pos, time = t.time, wood = t.wood;

        if (u == T && wood >= K)
            return time;

        for (int i = head[u]; i != -1; i = E[i].next) {
            int v = E[i].to;
            if (dp[v][wood + 1] > dp[u][wood] + E[i].dis) {
                dp[v][wood + 1] = dp[u][wood] + E[i].dis;
                q.push(Node(v, dp[v][wood + 1], wood + 1));
            }
        }
    }
    return -1;
}

void solve() {
    scanf("%d%d%d", &S, &T, &K);
    if (K % 10)
        K = K / 10 + 1;
    else
        K = K / 10;
    printf("%d\n", bfs());
}

int main() {
    while (scanf("%d%d", &n, &m) != EOF) {
        init();
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 15:35:57

HDU - 4396 More lumber is required (BFS 最短路)的相关文章

hdu 4396 More lumber is required(最短路)

hdu 4396 More lumber is required Description "More lumber(木材) is required" When the famous warcrafts player Sky wants to build a Central Town, he finds there is not enough lumber to build his Central Town. So he needs to collect enough lumber. H

HDOJ 题目4396 More lumber is required(至少经过k条边的最短路)

More lumber is required Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1392    Accepted Submission(s): 538 Problem Description "More lumber is required" When the famous warcrafts playe

More lumber is required

hdu4396:http://acm.hdu.edu.cn/showproblem.php?pid=4396 题意:一个无向带权图,然后给出起点s,终点e,让你求s到e的最短路径,但是这里的路径有要求的.每经过一条边会得到10单位的财富,这条路径必须得到的财富至少k值. 题解:一开始以为是DP,看了别人的代码,才知道了这就是传说中的二维最短路径.然后学习了一下,其实,就是图上的DP.dist[i][j]表示到达i点得到j个财富的最短路径.然后,利用spfa跑最短路,在这个过程中不断更新dist数

hdu 1312 Red and Black(BFS水题)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9684    Accepted Submission(s): 6021 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore

hdu 2102 A计划(双层BFS)(详解)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她

HDU 1195 Open the Lock 双向BFS

题目链接:Open the Lock 题意:就是给定两个4位数,起始,结束.问从起始数字到达结束数字 最少变换多少步,每个数 可以+1 / -1 或交换位置,都算做是一步. 单广,双广都用了,感觉双向BFS,太棒了,HDU的这个题双向BFS时间优化的太棒了 有图,有真相! 时间优化了近9倍... PS:今天还学习一个sscanf函数,挺棒的 单搜的代码就不贴了,贴个双搜的 #include<cstdio> #include <iostream> #include<cstrin

hdu 1195 Open the Lock (bfs+优先队列)

Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4253    Accepted Submission(s): 1858 Problem Description Now an emergent task for you is to open a password lock. The password is c

HDU 1180——诡异的楼梯( BFS)

诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 8717    Accepted Submission(s): 2148 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖

hdu 2102 A计划(双层BFS)(具体解释)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,由于他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来解救公主.只是公主早已习以为常,她