POJ 3026 Borg Maze bfs+Kruskal

题目链接:http://poj.org/problem?id=3026

感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值。

  1 #include <stdio.h>

  2 #include <string.h>

  3 #include <queue>

  4 #include <algorithm>

  5 using namespace std;

  6 

  7 char maze[50][50];

  8 int par[50];

  9 struct Point

 10 {

 11     int x, y;

 12 }point[110];

 13 

 14 struct Edge

 15 {

 16     int u, v, w;

 17     bool operator<(const struct Edge &b)const

 18     {

 19         return w < b.w;

 20     }

 21 }edge[10000];

 22 

 23 struct node

 24 {

 25     int x, y, step;

 26 };

 27 

 28 int find_set(int x)

 29 {

 30     return x == par[x] ? x : par[x] = find_set(par[x]);

 31 }

 32 

 33 queue<struct node>q;

 34 bool vis[50][50];

 35 int bfs(int x, int y, int ex, int ey)

 36 {

 37     while(!q.empty())q.pop();

 38     memset(vis, 0, sizeof(vis));

 39     int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};

 40     q.push((struct node){x, y, 0});

 41     vis[x][y] = 1;

 42     while(!q.empty())

 43     {

 44         struct node u = q.front();

 45         q.pop();

 46         if(u.x == ex && u.y == ey)

 47             return u.step;

 48         for(int i = 0; i < 4; i++)

 49         {

 50             if(!vis[u.x+dir[i][0]][u.y+dir[i][1]] && maze[u.x+dir[i][0]][u.y+dir[i][1]] != '#')

 51             {

 52                 vis[u.x+dir[i][0]][u.y+dir[i][1]] = 1;

 53                 q.push((struct node){u.x+dir[i][0], u.y+dir[i][1], u.step+1});

 54             }

 55         }

 56     }

 57 }

 58 

 59 int main()

 60 {

 61     int t, n, m;

 62     char fuck_space[100];

 63     scanf("%d%*c", &t);

 64     while(t--)

 65     {

 66         gets(fuck_space);

 67         sscanf(fuck_space, "%d %d", &m, &n);

 68         int point_rear = 0;

 69         for(int i = 0; i < n; i++)

 70         {

 71             gets(maze[i]);

 72             for(int j = 0; j < m; j++)

 73                 if(maze[i][j] == 'S' || maze[i][j] == 'A')

 74                     point[point_rear++] = (struct Point){i, j};

 75         }

 76         int edge_rear = 0;

 77         for(int i = 0; i < point_rear; i++)

 78         {

 79             for(int j = i+1; j < point_rear; j++)

 80             {

 81                 int w = bfs(point[i].x, point[i].y, point[j].x, point[j].y);

 82                 edge[edge_rear++] = (struct Edge){i, j, w};

 83             }

 84         }

 85         int ans = 0;

 86         for(int i = 0; i < point_rear; i++)

 87             par[i] = i;

 88         sort(edge, edge+edge_rear);

 89         for(int i = 0; i < edge_rear; i++)

 90         {

 91             int x = find_set(edge[i].u);

 92             int y = find_set(edge[i].v);

 93             if(x != y)

 94             {

 95                 ans += edge[i].w;

 96                 par[x] = y;

 97             }

 98         }

 99         printf("%d\n", ans);

100     }

101     return 0;

102 }
View Code

 

你可能感兴趣的:(poj)