提交不通过,但是测试用例对。先放着吧,调了快一下午没找到错。。
#include <stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct Point
{
int x,y;
};
struct direction//上下左右方向
{
int x,y;
}dir[5]={{0,0},{0,-1},{0,1},{-1,0},{1,0}};
const int INF=99999;
const int MAXV=51;
int col,row,nodeNum,sum;
bool visit[MAXV];
bool visit1[MAXV][MAXV];
int length[102][102];
int dist[102][102];
int node[MAXV][MAXV];
char matrix[MAXV][MAXV];
int lowcost[MAXV];
Point point;
void BFS(int a,int b)
{
int i;
memset(visit1,false,sizeof(visit1));//bfs中判断点的颜色是否为白色
memset(dist,0,sizeof(dist));//离初始点的距离
queue<Point> Q ;
point.x = a;point.y=b;
Q.push(point);
while(!Q.empty())
{
int x =Q.front().x;
int y =Q.front().y;
if(node[x][y])//如果是A或S,则记录距离
length[node[a][b]][node[x][y]]=dist[x][y];
Q.pop();
for(i=1;i<=4;i++)
{
int dx=x+dir[i].x;
int dy=y+dir[i].y;
if(dx>=0&&dx<col&&dy>=0&&dy<row&&!visit1[dx][dy]&&matrix[dx][dy]!='#')
{
point.x = dx;point.y = dy;
Q.push(point);
visit1[dx][dy]=true;
dist[dx][dy]=dist[x][y]+1;
}
}
}
}
void prim()
{
int temp,u,i,j;
memset(visit,false,sizeof(visit));
for(i=1;i<=nodeNum;i++)
length[i][i]=INF;
for(i=1;i<=nodeNum;i++)
lowcost[i]=length[1][i];
visit[1]=true;
for(i=1;i<=nodeNum;i++)
{
temp = INF;
for(j=1;j<=nodeNum;j++)
{
if(!visit[j]&&lowcost[j]<temp)
{
temp = lowcost[j];
u=j;
}
}
visit[u]=true;
if(temp==INF) break;
sum+=temp;
for(j=1;j<=nodeNum;j++)
{
if(!visit[j]&&lowcost[j]>length[u][j])
lowcost[j]=length[u][j];
}
}
}
int main()
{
int testCase,i,j;
char s[500];
// FILE *fp = freopen("data.txt","r",stdin);
scanf("%d",&testCase);
while(testCase--)
{
memset(node,0,sizeof(node));
scanf("%d%d\n",&col,&row);
nodeNum=0;
for(i=0;i<row;i++)
{
gets(s);
for(j=0;j<col;j++)
{
matrix[i][j]=s[j];
if(s[j]=='A'||s[j]=='S')
node[i][j]=++nodeNum; //点坐标和点编号对应
}
}
for(i=0;i<row;i++)//对每个字母为起点进行BFS
for(j=0;j<col;j++)
{
if(matrix[i][j]=='A'||matrix[i][j]=='S')
BFS(i,j);
}
sum=0;
prim();
printf("%d\n",sum);
}
return 0;
}