2025-10-19 hetao1733837刷题记录 Ⅱ
P4822 [BJWC2012] 冻结
原题链接:P4822 [BJWC2012] 冻结 - 洛谷
分析:一眼分层图(因为贪不了),那就很版了,直接上代码,仅作为考前复习分层图吧……
正解:
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
struct node{int dis, num, level; //距离,编号,使用SpellCard次数bool operator>(const node k) const{return dis > k.dis;}
};
int n, m, k;
priority_queue<node, vector<node>, greater<node>> q; //小根堆
int d[N][N];
vector<pair<int, int>> e[N];
bool vis[N][N];
void dijkstra(int S){memset(d, 0x3f, sizeof(d));memset(vis, 0, sizeof(vis));d[1][0] = 0;q.push({0, 1, 0});while (!q.empty()){auto tmp = q.top();q.pop();if (vis[tmp.num][tmp.level])continue;vis[tmp.num][tmp.level] = 1;for (auto tmp2 : e[tmp.num]){int v = tmp2.first;int w = tmp2.second;if (d[v][tmp.level] > tmp.dis + w){ //不用卡d[v][tmp.level] = tmp.dis + w;q.push({d[v][tmp.level], v, tmp.level});}if (tmp.level < k && d[v][tmp.level + 1] > tmp.dis + w / 2){ //用卡d[v][tmp.level + 1] = tmp.dis + w / 2;q.push({d[v][tmp.level + 1], v, tmp.level + 1});}}}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m >> k;for (int i = 1; i <= m; i++){int u, v, w;cin >> u >> v >> w;e[u].push_back({v, w});e[v].push_back({u, w});}dijkstra(1);int ans = 0x3f3f3f3f;for (int i = 0; i <= k; i++){ //可以不用完ans = min(ans, d[n][i]);}cout << ans;return 0;
}
注意审题,题目说的是边权减少50%,而非整体!