poj3026

链接:poj3026

题解

  • 这题很有意思,不用管A,S,当成一样的就好,跑一遍bfs跑出所有A的相关信息,然后套模板,然而我疯狂WA,原因是输入有坑,巨坑,
  • 详情看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#define rep(i,x,y) for(register int i=x;i<=y;++i)
#define repd(i,x,y) for(register int i=x;i>=y;--i)
#define ll long long
using namespace std;
const int N=107;
const int inf=0x3f3f3f3f;
typedef pair<int,int> s;
int T,n,m,dis[N][N],d[N][N],cnt,t[N][N],vis[N],ds[N];
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
char g[107][107];
queue<s> q;
void bfs(int a,int b){
while(!q.empty())q.pop();
memset(t,-1,sizeof(t));
q.push(s(a,b));
t[a][b]=0;
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
if(d[x][y])dis[d[a][b]][d[x][y]]=t[x][y];
q.pop();
rep(i,1,4){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<1||nx>n||ny<1||ny>m||g[nx][ny]=='#'||t[nx][ny]!=-1)continue;
t[nx][ny]=t[x][y]+1;
q.push(s(nx,ny));
}
}
}

int prim(int n){
int ans=0;
memset(ds,0,sizeof(ds));
memset(vis,0,sizeof(vis));
vis[1]=1;
rep(i,1,n)ds[i]=dis[1][i];
rep(i,2,n){
int minm=inf,p;
rep(j,1,n)if(!vis[j]&&ds[j]<minm)minm=ds[j],p=j;
if(minm==inf)return -1;
ans+=minm;
vis[p]=1;
rep(j,1,n)if(!vis[j]&&ds[j]>dis[p][j])ds[j]=dis[p][j];
}
return ans;
}


int main(){
scanf("%d",&T);
while(T--){
char c;
cnt=0;
scanf("%d%d",&m,&n);
memset(d,0,sizeof(d));
do{ //坑点
c=getchar();
}while(c!='\n');
rep(i,1,n){
gets(g[i]+1);
rep(j,1,m)if(g[i][j]=='S'||g[i][j]=='A')d[i][j]=++cnt;
}
rep(i,1,n)rep(j,1,m)if(d[i][j])bfs(i,j);
printf("%d\n",prim(cnt));
}
return 0;
}