poj 3411 dij+状压
来源:互联网 发布:windows rt刷win10移动 编辑:程序博客网 时间:2024/06/07 19:28
题意:
n个城市,编号为1~n,他们间有m条单向路,分别从a到b,可以在c处交P路费,也可以直接交R路费。
现在从1到n,问最少的花费是多少。
解析:
每次取边的时候判断一下。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long long#define lson lo, mi, rt << 1#define rson mi + 1, hi, rt << 1 | 1using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 11;int n, m;struct Edge{ int a, b, c, P, R; Edge() {} Edge(int _a, int _b, int _c, int _P, int _R) { a = _a; b = _b; c = _c; P = _P; R = _R; }};struct State{ int curPos, cost; int cover; State() {} State(int _curPos, int _cost, int _cover) { curPos = _curPos; cost = _cost; cover = _cover; } bool operator < (const State& b)const { return cost > b.cost; }};vector<Edge> edge[maxn];bool vis[maxn][1 << maxn];State ans;void dijkstra(){ priority_queue<State> q; q.push(State(1, 0, 1 << 1)); memset(vis, false, sizeof(vis)); while (!q.empty()) { State now = q.top(); q.pop(); if (vis[now.curPos][now.cover]) continue; vis[now.curPos][now.cover] = true; if (now.curPos == n) { ans = now; break; } for (vector<Edge>::iterator it = edge[now.curPos].begin(); it != edge[now.curPos].end(); ++it) { Edge e = *it; int cost = now.cost; if (now.cover & (1 << e.c)) { cost += min(e.P, e.R); } else { cost += e.R; } q.push(State(e.b, cost, now.cover | (1 << e.b))); } }}int main(){#ifdef LOCAL freopen("in.txt", "r", stdin);#endif // LOCAL while (~scanf("%d%d", &n, &m)) { for (int i = 0; i < m; i++) { int a, b, c, P, R; scanf("%d%d%d%d%d", &a, &b, &c, &P, &R); edge[a].push_back(Edge(a, b, c, P, R)); } ans.cost = -1; ans.cover = -1; ans.curPos = -1; dijkstra(); if (ans.curPos == -1) { puts("impossible"); } else { printf("%d\n", ans.cost); } } return 0;}
0 0
- poj 3411 dij+状压
- poj 1797 dij变形
- poj 2263 dij
- poj 1062 dij
- poj 1847 Tram (dij)
- poj 3463 Sightseeing dij
- poj 3439(dij最短路)
- poj 1724(优先队列+Dij)
- Dij
- Dij + 优先队列 poj 1724 Road
- poj 1502MPI Maelstrom(Dij, Floyd)
- POJ 2449 Remmarguts' Date Dij +A*
- poj 3662 二分答案或二维dij
- poj 3463 Sightseeing(dij)
- poj 3377 Ferry Lanes(dij+heap)
- poj-1556-The Doors-dij+线段相交
- poj 1062 (dij最短路径)
- poj 3114(korasaju算法和dij算法)
- 高性能IO模型浅析
- java IO流(File类)
- CCF 最大的矩形
- ZOJ Problem Set - 3543 Number String DP
- AsyncTask下载网络文件,并显示下载进度
- poj 3411 dij+状压
- J2EE开发时的命名规则,养成良好的开发习惯
- HDU 4292 Food(最小割,人数拆点)
- 行存储与列存储
- 在ibatis中使用oracle insert all 函数
- 登录表单
- 社会化海量数据采集爬虫框架搭建
- Windows下搭建Eclipse+Android4.0开发环境
- Visual C#2010学习笔记四之列表选择控件的使用