Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
题解:反正我是看不懂题意,别人说的啊。求S到全部A的距离和的最小值,这就是传说中的最小生成树了。当然,需要求出两点之间的最短距离。
普利姆:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3fffffff;
struct Node
{
int x;
int y;
int d;
Node(int a,int b,int c)
{
x = a;
y = b;
d = c;
}
};
char map[100][100]; //字符
bool visited[100][100]; //判断访问过没有
int cnt[100][100]; //记录该坐标的编号(A和S才有编号)
int d[2555][2555]; //点之间的距离
int di[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
bool visit[2555]; //普利姆用
int d2[2555];
int res;
void bfs(int x,int y,int n,int m)
{
memset(visited,false,sizeof(visited));
queue<Node> q;
q.push(Node(x,y,0));
visited[x][y] = true;
d[cnt[x][y]][cnt[x][y]] = 0;
while(!q.empty())
{
Node p = q.front();
q.pop();
for(int i = 0; i < 4;i++)
{
int xx = p.x + di[i][0];
int yy = p.y + di[i][1];
if(xx >= 0 && xx < n && yy >= 0 && yy < m)
{
if(visited[xx][yy])
{
continue;
}
if(map[xx][yy] == '#')
{
continue;
}
if(cnt[xx][yy] != -1)
d[cnt[x][y]][cnt[xx][yy]] = p.d + 1;
q.push(Node(xx,yy,p.d + 1));
visited[xx][yy] = true;
}
}
}
}
void prim(int n)
{
memset(visit,false,sizeof(visit));
res = 0;
for(int i = 0;i < n;i++)
{
d2[i] = d[0][i];
}
d2[0] = 0;
visit[0] = true;
for(int i = 1;i < n;i++)
{
int min = 1000000000;
int k;
for(int j = 0;j < n;j++)
{
if(!visit[j] && min > d2[j])
{
min = d2[j];
k = j;
}
}
res += min;
visit[k] = true;
for(int j = 0;j < n;j++)
{
if(!visit[j] && d2[j] > d[k][j])
{
d2[j] = d[k][j];
}
}
}
}
int main()
{
int ncase;
cin>>ncase;
char s[30];
while(ncase--)
{
int m,n;
scanf("%d%d",&m,&n);
gets(s);
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
scanf("%c",&map[i][j]);
}
getchar();
}
memset(cnt,-1,sizeof(cnt));
int k = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
if(map[i][j] == 'A' || map[i][j] == 'S')
{
cnt[i][j] = k++; //编号,0开始
}
}
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
if(cnt[i][j] != -1)
{
bfs(i,j,n,m); //从每一点开始找到其他点的最短距离
}
}
}
prim(k);
printf("%d\n",res);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/wang2534499/article/details/47790149