链接:http://poj.org/problem?id=3026
水题,注意数组大小,测试数据有点坑。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <string>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 2600
#define MAXM 3000
int dis[MAXN][MAXN];
int n,m;
char str[MAXN][MAXN];
bool vis[MAXM];
int low[MAXM];
int D[4][2]= { {1,0},{0,1},{-1,0},{0,-1} };
int prim()
{
memset(vis,0,sizeof(vis));
vis[0]=1;
int ans=0;
for(int i=1; i<n; ++i)
low[i]=dis[0][i];
for(int i=1; i<n; ++i)
{
int Min=INF,poi;
for(int j=1; j<n; ++j)
{
if(!vis[j] && low[j]<Min)
{
Min=low[j];
poi=j;
}
}
ans+=low[poi];
vis[poi]=1;
for(int j=1; j<n; ++j)
{
if(!vis[j] && low[j]>dis[poi][j])
low[j]=dis[poi][j];
}
}
return ans;
}
int pin[59][59];
int fin[59][59];
int visit[59][59];
struct node
{
int x,y;
int cost;
};
int cnt,px[MAXM],py[MAXM];
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d%d\n",&m,&n);
cnt=0;
for(int i=0; i<n; ++i)
{
gets(str[i]);
for(int j=0; j<m; ++j)
{
if(str[i][j]=='A'||str[i][j]=='S')
{
px[cnt]=i;
py[cnt]=j;
pin[i][j]=cnt++;
}
}
}
for(int i=0; i<n; ++i)
for(int j=0; j<m; ++j)
if(str[i][j]=='A'||str[i][j]=='S')
{
memset(visit,0,sizeof(visit));
queue<node> q;
while(!q.empty())q.pop();
node ni;
ni.x=i,ni.y=j;
ni.cost=0;
q.push(ni);
visit[i][j]=1;
while(!q.empty())
{
node ip=q.front();
q.pop();
for(int k=0; k<4; ++k)
{
int xx=ip.x+D[k][0];
int yy=ip.y+D[k][1];
if(xx<0 || yy<0 ||xx>=n ||yy>=m)continue;
if(!visit[xx][yy] && str[xx][yy]!='#')
{
visit[xx][yy]=1;
node ne;
ne.x=xx;
ne.y=yy;
ne.cost=ip.cost+1;
q.push(ne);
if(str[xx][yy]=='A'||str[xx][yy]=='S')
dis[ pin[i][j] ][ pin[xx][yy] ]=ne.cost;
}
}
}
}
n=cnt;
printf("%d\n",prim());
}
return 0;
}
/*
1
50 50
##################################################
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
# A#
# A#
# A#
#S A#
##################################################
*/