原题地址:点击打开链接
#include<stdio.h>
#include<queue>
#include<string.h>
#define MAX 1<<31-1
using namespace std;
struct Point
{
int x;
int y;
};
int d[110][110];
char map[55][55];
int numOfMap[55][55];
int vis[55][55];
int time[55][55];
int x[4]={-1,0,1,0},y[4]={0,1,0,-1};
int dist[110];
int used[110];
int num;
int m,n;
void bfs(Point p)
{
int i,a,b;
memset(vis,0,sizeof(vis));
memset(time,0,sizeof(time));
queue<Point>que;
que.push(p);
vis[p.x][p.y]=1;
while(!que.empty())
{
Point p1=que.front();
que.pop();
for(i=0;i<4;i++)
{
a=p1.x+x[i];
b=p1.y+y[i];
if(a>=0&&a<=m&&b>=0&&b<=n&&vis[a][b]!=1&&map[a][b]!='#')
{
time[a][b]=time[p1.x][p1.y]+1;
vis[a][b]=1;
que.push((Point){a,b});
if(numOfMap[a][b]>0)
{
d[numOfMap[p.x][p.y]][numOfMap[a][b]]=time[a][b];
}
}
}
}
}
int prim()
{
int i,j,min,u,res=0;
memset(used,0,sizeof(used));
for(i=1;i<=num;i++)
dist[i]=MAX;
dist[1]=0;
for(i=1;i<=num;i++)
{
min=MAX;
for(j=1;j<=num;j++)
{
if(!used[j]&&min>dist[j])
{
min=dist[j];
u=j;
}
}
used[u]=1;
for(j=1;j<=num;j++)
{
if(used[j]!=1&&dist[j]>d[u][j])
dist[j]=d[u][j];
}
}
for(i=1;i<=num;i++)
res+=dist[i];
return res;
}
int main()
{
int i,j,t;
char str[110];
scanf("%d",&t);
while(t--)
{
num=0;
memset(numOfMap,0,sizeof(numOfMap));
memset(d,0,sizeof(d));
scanf("%d%d",&n,&m);
gets(str);
for(i=0;i<m;i++)
gets(map[i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(map[i][j]=='A'||map[i][j]=='S')
{
numOfMap[i][j]=++num;
}
}
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
d[i][j]=MAX;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(numOfMap[i][j]>0)
{
bfs((Point){i,j});
}
}
int res=prim();
printf("%d\n",res);
}
return 0;
}
/*
3
6 5
#####
#A#A##
# # A#
#S ##
#####
7 7
#####
#AAA###
# A#
# S ###
# #
#AAA###
#####
7 7
#####
#AA#A##
# A#
# S ###
# #
#AAA###
#####
*/