HDU 4856 Tunnels

來源:互聯網
上載者:User

標籤:style   blog   os   2014   for   io   

題意:求經過所有的管道的最短路程,管道內的時間不算

思路:首先BFS處理出管道出口到其他管道入口的距離,然後在隊友的指導下明白了狀態轉移

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 16;const int INF = 0x3f3f3f3f;struct Node {int sx, sy, ex, ey;} node[MAXN];struct point {int x, y, step;};char g[MAXN][MAXN];int n, m, dp[1<<MAXN][MAXN];int dx[4]={1, -1, 0, 0};int dy[4]={0, 0, 1 ,-1};int vis[MAXN][MAXN], dis[MAXN][MAXN];void bfs(int from, int to, int sx, int sy, int ex, int ey) {memset(vis, 0, sizeof(vis));queue<point> q;point a;a.x = sx, a.y = sy, a.step = 0;q.push(a); vis[sx][sy] = 1;while (!q.empty()) {point cur = q.front();q.pop();if (cur.x == ex && cur.y == ey) {dis[from][to] = cur.step;return;}for (int i = 0; i < 4; i++) {int nx = cur.x + dx[i];int ny = cur.y + dy[i];if (g[nx][ny] == '#' || vis[nx][ny])continue;if (nx > 0 && nx <= n && ny > 0 && ny <= n) {vis[nx][ny] = 1;point b;b.x = nx, b.y = ny;b.step = cur.step + 1;q.push(b);}}}}int main() {while (scanf("%d%d", &n, &m) != EOF) {for (int i = 1; i <= n; i++)scanf("%s", g[i]+1);for (int i = 0; i < m; i++)  scanf("%d%d%d%d", &node[i].sx, &node[i].sy, &node[i].ex, &node[i].ey);memset(dis, -1, sizeof(dis));for (int i = 0; i < m; i++)for (int j = 0; j < m; j++)bfs(i, j, node[i].ex, node[i].ey, node[j].sx, node[j].sy);memset(dp, -1, sizeof(dp));for (int i = 0; i < m; i++)dp[1<<i][i] = 0;int all = (1<<m);for (int i = 0; i < all; i++) for (int j = 0; j < m; j++) {if (i&(1<<j) && dp[i][j] != -1) {for (int k = 0; k < m; k++) {if (!(i&(1<<k)) && dis[k][j] != -1) {int next = i|(1<<k);int val = dp[i][j]+dis[k][j];if (dp[next][k] == -1 || val < dp[next][k])dp[next][k] = val;}}}}int ans = -1;for (int i = 0; i < m; i++) {if (dp[all-1][i] == -1)continue;if (ans == -1 || ans > dp[all-1][i])ans = dp[all-1][i];}printf("%d\n", ans);}return 0;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.