7_22_S题 Borg Maze(最小生成树)

来源:互联网 发布:网络爬虫系统架构图 编辑:程序博客网 时间:2024/06/17 23:38

7_22_S题 Borg Maze


题意

给出一个矩阵,求将其中的A和S全部连通的最小距离。

思路

最小生成树,先BFS处理出所有字母两两之间的最短距离。然后跑一遍最小生成树即可,这题输入数据神坑。。。

代码

#include <cmath>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;const int maxm = 150*150*2;const int maxn = 150;typedef long long ll;int n,m;int mov[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};int maze[maxn][maxn];struct Edges{    int u,v;    double w;    Edges(){};    Edges(int u,int v,double w):u(u),v(v),w(w){};    bool operator < (const Edges & b) const {        return w < b.w;    }}edge[maxm];int fa[maxn];int Find(int x){    return fa[x] == x ? x :fa[x] = Find(fa[x]);}bool Union(int x ,int y){    x = Find(x);    y = Find(y);    if(x == y) return false;    fa[x] = y;    return true;}double lent = 0;void init(int n){    for(int i = 0 ; i <= n ; i ++)        fa[i] = i;    lent = 0;}struct Point{    int x,y,len;    Point(){};    Point(int x, int y):x(x),y(y){};}Loc[maxn];int cnt = 0;bool vis[maxn][maxn];int bfs(Point cur,int idx){    memset(vis, 0,sizeof vis);    cur.len = 0;    queue<Point> Q;    Q.push(cur);    while(!Q.empty()){        cur = Q.front(); Q.pop();        vis[cur.x][cur.y] = true;;        Point next;        for(int i = 0 ; i < 4 ; i ++){            next.x = cur.x + mov[i][0];            next.y = cur.y + mov[i][1];            next.len = cur.len + 1;            if(next.x >= 0 && next.x <= n && next.y >=0 && next.y <= m && !vis[next.x][next.y]){                if(maze[next.x][next.y] == 32){                    Q.push(next);                    vis[next.x][next.y] = true;;                }                else if(maze[next.x][next.y] > 1e6){                    edge[cnt ++] = Edges(idx,maze[next.x][next.y] - 1e6, next.len);                }            }        }    }}int main (){    int T;    scanf("%d", &T);    while (T --){        int cntp = 0;        scanf("%d %d", &m,&n);        while(getchar()!='\n');        for(int i = 0 ; i < n ; i ++){            for(int k = 0 ; k < m ; k ++){                maze[i][k] = getchar();                if(maze[i][k] >= 'A' && maze[i][k] <= 'Z'){                    maze[i][k] = 1e6 + cntp;                    Loc[cntp++] = Point(i,k);                }            }            while(getchar()!='\n');        }        init(cntp);        cnt = 0;        for(int i = 0 ; i < cntp ; i ++){            bfs(Loc[i],maze[Loc[i].x][Loc[i].y]-1e6);        }        sort(edge,edge+cnt);        for(int i = 0 ; i < cnt ; i ++){            Edges & e = edge[i];            if(Union(e.u,e.v)) {                lent += e.w;            }        }        printf("%.0f\n", lent);    }}
0 0