poj1062 昂贵的聘礼 (spfa)
2015-01-09 18:06
225 查看
思路:因为交易过的所有人等级之差最大不能超过m,所以枚举每一个宽为m的范围,其中必须包涵1号节点,遇到范围之外的点不考虑,分别求最短路即可。
代码:
代码:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; struct Edge{ int to, v; Edge(int a, int b) : to(a), v(b) {} }; int n, m; int level[105]; vector<Edge> edges[105]; int dist[105]; int vis[105]; void spfa(int l, int r) { queue<int> q; memset(dist, 0x3f, sizeof(dist)); memset(vis, 0, sizeof(vis)); dist[0] = 0; q.push(0); vis[0] = 1; while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = 0; i < edges[cur].size(); i++) { Edge e = edges[cur][i]; if (level[e.to] < l || level[e.to] > r) continue;// 限制之外的点不考虑 if (dist[cur] + e.v < dist[e.to]) { dist[e.to] = dist[cur] + e.v; if (!vis[e.to]) { q.push(e.to); vis[e.to] = 1; } } } vis[cur] = 0; } } int main() { while (~scanf("%d %d", &m, &n)) { int a, b, k; for (int i = 0; i <= n; i++) edges[i].clear(); for (int i = 1; i <= n; i++) { scanf("%d %d %d", &a, &b, &k); edges[0].push_back(Edge(i, a)); level[i] = b; for (int j = 1; j <= k; j++) { scanf("%d %d", &a, &b); edges[a].push_back(Edge(i, b)); } } int ans = 0x3f3f3f3f; for (int i = level[1] - m; i <= level[1]; i++) {// 枚举等级限制 spfa(i, i + m); ans = min(ans, dist[1]); } cout << ans << endl; } return 0; }
相关文章推荐
- POJ-1062-昂贵的聘礼(SPFA)
- POJ 1062 昂贵的聘礼 [最短路径 SPFA]
- SPFA 最短路 —— POJ 1062 昂贵的聘礼
- Poj 1062 昂贵的聘礼【最短路SPFA】
- POJ1062 昂贵的聘礼 解题报告【最短路/SPFA】
- POJ 1062 昂贵的聘礼(SPFA)
- POJ -1062 昂贵的聘礼(前向星 && SPFA)
- poj&nbsp;1062&nbsp;昂贵的聘礼(spfa)
- 【POJ】1062 昂贵的聘礼(spfa)
- poj_1062 昂贵的聘礼(SPFA)
- poj1062 昂贵的聘礼 (dijkstra最短路算法)
- poj1062 昂贵的聘礼
- poj1062昂贵的聘礼(dijkstra)
- POJ1062——昂贵的聘礼
- POJ1062-昂贵的聘礼
- POJ 1062:昂贵的聘礼
- POJ-1062 昂贵的聘礼 解题报告
- POJ - 1062 昂贵的聘礼 (BFS解法)
- POJ1062昂贵的聘礼
- POJ-1062 昂贵的聘礼 (dijkstra算法)