/*
translation:
给出一张图,求节点0到节点n-1花费的最小费用。对于一条边a->b,可以有一下两种不同的付费方式:
1.在点c提前预付,但此时必须经过点c,花费为r
2.在点b支付,花费为p
solution:
状态压缩dp+dijkstra
dp[i][s]:=走到i点时的最优解,且此时走过的点状态为s(包括i)
然后根据dijkstra不断松弛即可。
note:
* 一开始按照普通的DAG状态压缩的做法是错误的,因为这种做法只能使用于有向无环图。而题目中的图可能存在环
所以只能按照dijkstra来进行松弛操作的同时进行状态转移。
# 题目中的点可能经过多次,所以枚举状态时的条件注意设置好,见代码注释
date:
2017.1.20
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 15;
const int INF = 0x3f3f3f3f;
int n, m;
int dp[maxn][1 << maxn]; //dp[i][s]:=走到i点时的最优解,且此时走过的点状态为s(包括i)
struct Edge
{
int to, k, r, p;
Edge(int to_, int k_, int r_, int p_):to(to_),k(k_),r(r_),p(p_){}
Edge(){}
};
vector<Edge> edges[maxn];
typedef pair<int,int> P;
typedef pair<P,int> node; //p.first:节点
poj3411(状态压缩dp,dijkstra最短路)
最新推荐文章于 2022-01-16 10:29:32 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)