• Borg Maze POJ


    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    #include<queue>
    using namespace std;
    typedef pair<int,int>PII; 
    //原地图 
    char g[100][100];
    int n,m;
    //存原点和s的坐标 
    int pos[100][100];
    int move[][2]={{1,0},{-1,0},{0,1},{0,-1}};
    
    int cost[110][110];
    //距离 
    int t[100][100];
    //处理每个点到其他点的最小距离 
    void bfs(int sx,int sy)
    {
        queue<PII>q;
        while(!q.empty())
            q.pop();
        memset(t,-1,sizeof(t));
        t[sx][sy]=0;
        q.push({sx,sy});
        while(!q.empty())
        {
            pair<int,int>now=q.front();
            q.pop();
            if(pos[now.first][now.second]!=-1)
                //记录(sx,sy)到now的花费 
                cost[pos[sx][sy]][pos[now.first][now.second]]=t[now.first][now.second];
            for(int i=0;i<4;i++)
            {
                int tx=now.first+move[i][0];
                int ty=now.second+move[i][1];
                if(g[tx][ty]=='#'||t[tx][ty]!=-1)
                    continue;
                t[tx][ty]=t[now.first][now.second]+1;
                q.push({tx,ty});
            }
        }
    }
    const int INF=0x3f3f3f3f;
    bool vis[110];
    int low_cost[110];
    //求最小生成树 
    int Prim(int n)
    {
        int ans=0;
        memset(vis,false,sizeof(vis));
        vis[0]=true;
        for(int i=1;i<n;i++)
            low_cost[i]=cost[0][i];
        for(int i=1;i<n;i++)
        {
            int minc=INF;
            int p=-1;
            for(int j=0;j<n;j++)
                if(!vis[j]&&minc>low_cost[j])
                {
                    minc=low_cost[j];
                    p=j;
                }
            if(minc==INF)
                return -1;
            ans+=minc;
            vis[p]=true;
            for(int j=0;j<n;j++)
                if(!vis[j]&&low_cost[j]>cost[p][j])
                    low_cost[j]=cost[p][j];
        }
        return ans;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>m>>n;
            cin>>g[0];
            memset(pos,-1,sizeof pos);
            int tot=0;
            for(int i=0;i<n;i++)
            {
                gets(g[i]);
                for(int j=0;j<m;j++)
                    if(g[i][j]=='A'||g[i][j]=='S')
                        pos[i][j]=tot++;
            }
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(pos[i][j]!=-1)
                        bfs(i,j);
            printf("%d
    ",Prim(tot));
        }
        return 0;
    }
  • 相关阅读:
    常用网址
    设备像素比devicePixelRatio简单介绍
    VR虚拟红包的技术实现
    jQuery重置表单
    jQuery,遍历表格每个单元格数据。
    java 23种设计模式 链接集锦
    webstorm创建nodejs + express + jade 的web 项目
    类与类之间的几种关系
    JS 中的事件绑定、事件监听、事件委托是什么?
    简单的JavaScript图像延迟加载库Echo.js
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12240399.html
Copyright © 2020-2023  润新知