64,682
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<string.h>
#define INF 2501
/*用简洁的代码 来解决问题 拒绝脏乱差..不断提高中....*/
int N; //记录测试次数
int map_w,map_h; //对应每组测试前两个数字相当于j和i
char map[51][51]; //用来读输入
int dir4[4][2]={
0,-1,1,0,0,1,-1,0
};
int newmap[51][51]; //用BFS在其之上构造新图 Prim算法运行在新图之上
struct VNODE{
int x,y;
};
VNODE vertex[2501];
int nvex;
VNODE queue[2501];
int head=0;
int tail=0;
bool vis[51][51];
int t[51][51];
int BFS2(VNODE s,VNODE e){
memset(t,0,sizeof(t));
memset(vis,false,sizeof(vis));
vis[s.x][s.y]=true;
head=tail =0;
queue[tail++]=s;
while(head!=tail){
VNODE u,v;
u = queue[head++];
for(int i=0;i<4;i++){
v.x=u.x+dir4[i][0];
v.y=u.y+dir4[i][1];
if(vis[v.x][v.y]||map[v.x][v.y]=='#')continue;
queue[tail++]=v;
t[v.x][v.y]=t[u.x][u.y]+1;
if(v.x==e.x&&v.y==e.y){
return t[v.x][v.y];
}
vis[u.x][u.y]=true;
}
}
return 0;
}
int Prim(int nvex){
int lowcost[51];
int closest[51];
int flag=0,e=0,min_cost=0,max_cost=0;
int num=0;
memset(closest,false,sizeof(closest));
closest[e]=true ;
for(int i=0;i<nvex;i++){
lowcost[i]=INF;
}
while(++num < nvex)
{
min_cost=INF;
for(int i=1;i<nvex;i++)
if(!closest[i]){
if(newmap[e][i]<lowcost[i])
lowcost[i]=newmap[e][i];
if(min_cost>lowcost[i])
min_cost=lowcost[flag = i];
}
closest[e = flag]=true;
max_cost+=min_cost;
}
return max_cost;
}
int main(){
scanf("%d",&N);
while(N--){
// 读取矩阵 并转置成地图
scanf("%d %d",&map_w,&map_h);
getchar();
nvex=0;
for(int y=0;y<map_h;y++) //y相当于i
{
gets(map[y]);
for(int i=0;i<map_w;i++)
if(map[y][i]!=' '&&map[y][i]!='#')
{
vertex[nvex].x=y; //由于图是按行存储的 所以x,y与i,j
vertex[nvex].y=i; //含义相同
nvex++; //PS:本来我是按列存储的
}
}
for(int i=0;i<nvex;i++){
for(int j=i+1;j<nvex;j++){
newmap[i][j]=newmap[j][i] = BFS2(vertex[i],vertex[j]);
}
}
for(int i=0;i<nvex;i++){
newmap[i][i]=0;
}
printf("%d\n",Prim(nvex));
}
}