793D Presents in Bankopolis

来源:互联网 发布:冯绍峰双龙出洞 知乎 编辑:程序博客网 时间:2024/06/05 10:03
#include<iostream>#include<vector>#include<string>#include<set>#include<map>#include<algorithm>#include<queue>#include<list>#include<stack>#include<cstdio>#include<fstream>#include<numeric>#include<functional>#include<utility>#include<memory.h>using namespace std;using namespace placeholders;int area[82][82];int dp[82][82][82][82];int n, k, m;int Cal(int left, int right, int cur, int amount){if (dp[left][right][cur][amount] != -1) return dp[left][right][cur][amount];if (amount == 1){dp[left][right][cur][amount] = 0;return 0;}int res = 1e8;for (int i = 1; i <= n; i++){if (area[cur][i] <= 1000 && i>left&&i<right){int l = left, r = right;if (cur < i) l = cur;else r = cur;res = min(res, area[cur][i] + Cal(l, r, i, amount - 1));}}dp[left][right][cur][amount] = res;return res;}int main(){while (cin >> n >> k){cin >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) area[i][j] = 1e8;memset(dp, -1, sizeof(dp));for (int i = 1; i <= m; i++){int u, v, c;cin >> u >> v >> c;area[u][v] = min(area[u][v], c);}int ans = 1e8;for (int i = 1; i <= n; i++){int left = 0;int right = n + 1;ans = min(ans, Cal(left, right, i, k));}if (ans >= 1e8) cout << "-1" << endl;else cout << ans << endl;}return 0;}

0 0
原创粉丝点击