日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU-4568 Hunter 状态压缩

發(fā)布時間:2025/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU-4568 Hunter 状态压缩 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:給定一個網(wǎng)格圖,圖中有一些點要求全部走到,問最少的花費是多少,從任意邊界進入,任意邊界出去,如果不能夠全部走到,輸出0。

解法:一次spfa從邊界上的所有點出發(fā),計算到K個寶藏的最短路,然后計算出任意兩個寶藏之間的最短路,最后狀態(tài)壓縮枚舉即可。

代碼如下:

#include <cstdlib> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std;// 記得要帶走全部的物品 const int INF = 0x3f3f3f3f; int N, M, K; int mp[205][205]; int idis[15][15]; // 這個15*15的矩陣用來保留寶藏之間的最短路程 int odis[15]; // 從邊界到K個位置的最短距離struct Node {int x, y; }p[15];int que[1000005]; int dis[40005]; char vis[40005]; int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};bool legal(int x, int y) {if (x < 0 || x >= N || y < 0 || y >= M) return false;return true; }void spfa(int sta, int num) {int front = 0, tail = 0;memset(dis, 0x3f, sizeof (dis));memset(vis, 0, sizeof (vis));que[tail++] = sta;dis[sta] = 0, vis[sta] = 1;while (front < tail) {int cur = que[front++], nxt;vis[cur] = 0;int x = cur / M, y = cur % M;int xx, yy;for (int k = 0; k < 4; ++k) {xx = x + dir[k][0], yy = y + dir[k][1];nxt = xx * M + yy;if (legal(xx, yy)) {if (dis[nxt] > dis[cur] + mp[xx][yy]) {dis[nxt] = dis[cur] + mp[xx][yy];if (!vis[nxt]) {vis[nxt] = 1;que[tail++] = nxt;}}}}}for (int i = 0; i < K; ++i) {idis[num][i] = dis[p[i].x * M + p[i].y];} }void bspfa() {int front = 0, tail = 0;memset(dis, 0x3f, sizeof (dis));memset(vis, 0, sizeof (vis));for (int i = 0; i < N; ++i) {int k1 = i * M, k2 = i * M + M-1;que[tail++] = k1, que[tail++] = k2;dis[k1] = mp[i][0], dis[k2] = mp[i][M-1]; // 邊界點均被初始距離為0加入進來 vis[k1] = vis[k2] = 1;}for (int j = 1; j < M - 1; ++j) {int k1 = j, k2 = (N-1) * M + j;que[tail++] = k1, que[tail++] = k2;dis[k1] = mp[0][j], dis[k2] = mp[N-1][j];vis[k1] = vis[k2] = 1;}while (front < tail) {int cur = que[front++], nxt;vis[cur] = 0;int x = cur / M, y = cur % M;int xx, yy;for (int k = 0; k < 4; ++k) {xx = x + dir[k][0], yy = y + dir[k][1];nxt = xx * M + yy;if (legal(xx, yy)) {if (dis[nxt] > dis[cur] + mp[xx][yy]) {dis[nxt] = dis[cur] + mp[xx][yy];if (!vis[nxt]) {vis[nxt] = 1;que[tail++] = nxt;}}}}}for (int i = 0; i < K; ++i) {odis[i] = dis[p[i].x*M + p[i].y];} }int f[13][1<<13]; // f[i][j]表示狀態(tài)為j,并且最后走的位置為i的最少開銷 int dfs(int sta, int nxt) {if (~f[nxt][sta] && nxt != -1) {return f[nxt][sta];}if (sta == 0) {return f[nxt][sta] = odis[nxt]; // 從nxt開始進入 }int ret = INF;for (int i = 0; i < K; ++i) {if (sta&(1 << i)) {if (nxt != -1)ret = min(ret, dfs(sta^(1 << i), i) + idis[i][nxt]);elseret = min(ret, dfs(sta^(1 << i), i) + odis[i] - mp[p[i].x][p[i].y]);// 走i點走出去的 }}return f[nxt][sta] = ret; }int solve() {memset(f, 0x3f, sizeof (f));int mask = 1 << K;for (int i = 0; i < K; ++i) f[i][1<<i] = odis[i];for (int i = 2; i < mask; ++i) {if (!(i - (i&(-i)))) continue; // 如果只有一位為1for (int j = 0; j < K; ++j) {if (!(i&(1<<j))) continue;for (int k = 0; k < K; ++k) {f[j][i] = min(f[j][i], f[k][i^(1<<j)] + idis[k][j]);}}}int ret = INF;for (int i = 0; i < K; ++i) {ret = min(ret, f[i][mask-1] + odis[i] - mp[p[i].x][p[i].y]);}return ret; }int main() {int T; // freopen("1.in", "r", stdin);scanf("%d", &T);while (T--) {scanf("%d %d", &N, &M);memset(idis, 0x3f, sizeof (idis));memset(odis, 0x3f, sizeof (odis));for (int i = 0; i < N; ++i) {for (int j = 0; j < M; ++j) {scanf("%d", &mp[i][j]);if (mp[i][j] == -1) mp[i][j] = INF;}}scanf("%d", &K);for (int i = 0; i < K; ++i) {scanf("%d %d", &p[i].x, &p[i].y);}for (int i = 0; i < K; ++i) {spfa(p[i].x * M + p[i].y, i);}bspfa();memset(f, 0xff, sizeof (f));int ret = dfs((1<<K)-1, -1);// int ret = solve(); // 也可 if (ret == INF) puts("0");else printf("%d\n", ret); }return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Lyush/archive/2013/06/07/3123953.html

總結(jié)

以上是生活随笔為你收集整理的HDU-4568 Hunter 状态压缩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 艳妇乳肉豪妇荡乳av无码福利 | 亲嘴脱内衣内裤 | 日韩色图片| 爱爱一区二区三区 | 国产黄免费 | 国产91视频在线 | 国产精品不卡在线 | 黄色高潮视频 | 小珊的性放荡羞辱日记 | 日韩乱码一区二区三区 | 国产中文字幕在线播放 | 精品人妻一区二区三区四区五区 | 人人妻人人爽一区二区三区 | 国产精品毛片va一区二区三区 | 伊人久久久久久久久久久 | 91久久人澡人人添人人爽欧美 | ,国产精品国产三级国产 | 国产成人精品免费网站 | 中国1级毛片 | 免费看黄在线 | 免费av网址大全 | 色亚洲视频 | 特级西西www444人体聚色 | 日韩精品影视 | 福利视频99 | 涩涩网址 | 叶山小百合av一区二区 | 日本乱码一区 | 黄色在线观看网站 | 成人手机看片 | 久久午夜夜伦鲁鲁片无码免费 | 天堂网在线视频 | 亚洲无码久久久久久久 | youjizz麻豆 | 丁香花电影免费播放在线观看 | 亚洲福利视频一区二区 | 毛片库 | 国内精品久久久久久 | 成人精品视频一区二区三区尤物 | 国内偷拍一区二区 | 最新福利在线 | 亚洲v日韩v综合v精品v | 高级毛片| va在线观看 | 艳母日本动漫在线观看 | 日韩福利网 | 秋霞国产午夜精品免费视频 | 久久精品婷婷 | 日韩免费av一区 | 免费福利视频在线观看 | 精品久久久一区 | 成人中文字幕在线观看 | 九九精品在线观看视频 | 国产精品815.cc红桃 | 一区二区三区三区在线 | 性欧美videos另类hd | 蜜桃av在线播放 | 国产精品91在线观看 | www插插插| 国产一二 | 高清性爱视频 | 伊人婷婷色 | 日韩狠狠| 欧美激情另类 | 天堂…中文在线最新版在线 | 都市激情 亚洲 | 99热这里只有精品1 亚洲人交配视频 | 日韩欧美国产精品综合嫩v 国产小毛片 | 国产福利一区二区视频 | 久久思| 色大师在线观看 | 亚洲精品视频网 | 国产精品久久久久久久成人午夜 | 欧美成人精品激情在线视频 | 国产精品久久久久毛片大屁完整版 | 爱蜜臀av | 精品无人国产偷自产在线 | 免费成人毛片 | 亚洲国产毛片aaaaa无费看 | 啪啪福利| 国产三级在线播放 | 免费看一级一片 | 国产精品嫩草影院av蜜臀 | 亚洲爽爆 | 艳妇乳肉亭妇荡乳av | 国产综合网站 | 久久国产小视频 | 动漫3d精品一区二区三区乱码 | 亚洲成人黄色在线观看 | 中文在线中文资源 | 在线播放你懂得 | 亚洲在线色 | 成人午夜激情影院 | 美女擦边视频 | 欧美大胆视频 | 黑人玩弄人妻一区二 | 亚洲色图40p | 老男人av| 日本久久黄色 |