我是靠谱客的博主 感性冷风,这篇文章主要介绍POJ_1062_最短路变形,现在分享给大家,希望可以做个参考。

POJ 1062

  • 题意:
  1. 替换就相当于一条指向另一个点的有向边,权值是价值,但是每个点都有等级作为限制条件,
  2. 限制条件还必须在一个范围,例如:
    level[1] = 3 m=1,节点等级限制范围:[2,3]、[3,4],
    level[1] = 3 m=2, 范围:[1,3]、[2,4],[3,5]
    3.每次最短路在将不再范围的点排除,然后取每个范围中最短的点.
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream> #include <queue> #include <string.h> using namespace std; const int maxn = 105; const int inf = 0x3f3f3f3f; int e[maxn][maxn]; int dist[maxn]; int level[maxn]; bool vis[maxn]; int value[maxn]; int n,radium; int dij() { priority_queue<pair<int,int> > que; memset(dist,0x3f,sizeof dist); dist[1] = 0; que.push( make_pair(-dist[1],1) ); while (!que.empty()) { int cur = que.top().second; que.pop(); if (vis[cur]) continue; vis[cur] = 1; for (int i=1; i<=n; i++) { if (!vis[i] && dist[i] > dist[cur] + e[cur][i]) { dist[i] = dist[cur] + e[cur][i]; que.push( make_pair(-dist[i],i) ); } } } int MIN = inf; for (int i=1; i<=n; i++) MIN = min(MIN,dist[i]+value[i]); return MIN; } int main() { // freopen("a.txt","r",stdin); cin >> radium >> n; memset(e,0x3f,sizeof e); int k; for (int i=1; i<=n; i++) { cin >> value[i] >> level[i] >> k; for (int j=1; j<=k; j++) { int to,div; cin >> to >> div; e[i][to] = div; } } int ans = inf; for (int i=0; i<=radium; i++) { // 枚举一路的等级区间范围 memset(vis,0,sizeof vis); for (int j=1; j<=n; j++) // 把超出等级范围的点这一轮排除掉 if (level[1] - radium + i > level[j] || level[j] > level[1] + i) vis[j] = 1; ans = min(ans,dij()); } cout << ans; return 0; }

最后

以上就是感性冷风最近收集整理的关于POJ_1062_最短路变形的全部内容,更多相关POJ_1062_最短路变形内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部