題目蠻簡單的。思路:先用bfs求任意兩點之間的最短距離(這裡的兩點指的是A或者是S),然後求最小產生樹,即為答案。
這裡有一個250的地方,就是在x,y之後要用gets()。
#include<iostream><br />#include<cstdio><br />using namespace std;<br />#define N 105<br />#define M 55<br />#define max_int 99999999<br />int cost[N][N],dist[N];<br />int map[M][M];<br />char maze[M][M];<br />bool vis[M][M],s[N];<br />struct node<br />{<br />int i,j,step;<br />};<br />node que[M*M],original,p[N];<br />int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};<br />int choose(int n)<br />{<br />int m=max_int,pos=-1;<br />for(int i=0;i<n;i++)<br />if(dist[i]<m&&!s[i])<br />{<br />m=dist[i];<br />pos=i;<br />}<br />return pos;<br />}<br />void prim(int n,int v)<br />{<br />int u,weight=0,i;<br />memset(s,0,sizeof(s));<br />for(i=0;i<n;i++)<br />dist[i]=max_int;<br />dist[v]=0;<br />while(1)<br />{<br />u=choose(n);<br />if(u==-1)<br />break;<br />weight+=dist[u];<br />s[u]=1;<br />for(i=0;i<n;i++)<br />if(!s[i]&&dist[i]>cost[u][i])<br />dist[i]=cost[u][i];<br />}<br />printf("%d/n",weight);<br />return ;<br />}<br />void bfs(int s_i,int s_j)<br />{<br />int front=-1,rear=0,i,next_i,next_j;<br />node temp,add;<br />memset(vis,0,sizeof(vis));<br />que[0].i=s_i,que[0].j=s_j,que[0].step=0;<br />vis[s_i][s_j]=1;<br />while(front<rear)<br />{<br />temp=que[++front];<br />for(i=0;i<4;i++)<br />{<br />next_i=temp.i+dir[i][0];<br />next_j=temp.j+dir[i][1];<br />if(maze[next_i][next_j]!='#'&&!vis[next_i][next_j])<br />{<br />vis[next_i][next_j]=1;<br />add.i=next_i;<br />add.j=next_j;<br />add.step=temp.step+1;<br />que[++rear]=add;<br />}<br />}<br />}<br />for(i=1;i<=rear;i++)<br />if(maze[que[i].i][que[i].j]=='A'||maze[que[i].i][que[i].j]=='S')<br />cost[map[que[0].i][que[0].j]][map[que[i].i][que[i].j]]=<br />cost[map[que[i].i][que[i].j]][map[que[0].i][que[0].j]]=<br />que[i].step;<br />return ;<br />}<br />void init(int n)<br />{<br />int i,j,k;<br />for(i=0;i<n;i++)<br />for(j=i;j<n;j++)<br />cost[i][j]=cost[j][i]=max_int;<br />for(k=0;k<n;k++)<br />map[p[k].i][p[k].j]=k;<br />for(k=0;k<n;k++)<br />bfs(p[k].i,p[k].j);<br />return ;<br />}<br />int main()<br />{<br />int ca,x,y,i,j,k;<br />char line[M];<br />scanf("%d",&ca);<br />while(ca--)<br />{<br />k=0;<br />scanf("%d%d",&x,&y);<br />gets(line);<br />for(i=1;i<=y;i++)<br />{<br />for(j=1;j<=x;j++)<br />{<br />maze[i][j]=getchar();<br /> if(maze[i][j]=='A'||maze[i][j]=='S')<br /> {<br /> p[k].i=i;<br /> p[k].j=j;<br /> k++;<br /> }<br /> if(maze[i][j]=='S')<br /> {<br /> original.i=i;<br /> original.j=j;<br /> }<br />}<br />getchar();<br />}<br />init(k);<br />prim(k,map[original.i][original.j]);<br />}<br />return 0;<br />}