题目大意:有一个需要采集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-12-04 19:28:07