Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6891 | Accepted: 2309 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
#include<stdio.h> #include<iostream> #include<cstring> using namespace std; #define inf 10000 #define large 300 struct que{ int x,y,step; }queue[15000]; int dis[large][large]; int n,m,flag; char map[60][60]; struct ptkdj{ int x,y; }po[large]; int point[large][large]; int can[large][large]; int zhang[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; void BFS(int sx,int sy,int ex,int ey) { memset(can,0,sizeof(can)); int t,w,x,y,t1,t2,i; t=w=1; queue[t].x=sx; queue[t].y=sy; queue[t].step=0; can[sx][sy]=1; while(t<=w&&!can[ex][ey]) { x=queue[t].x; y=queue[t].y; for(i=0;i<4;i++) if(map[x+zhang[i][0]][y+zhang[i][1]]!='#') { t1=x+zhang[i][0]; t2=y+zhang[i][1]; if(t1>0&&t1<=n&&&t2>0&&t2<=m&&!can[t1][t2]&&(map[t1][t2])!='#') { queue[++w].x=t1; queue[w].y=t2; queue[w].step=queue[t].step+1; can[t1][t2]=1; } } t++; } dis[point[sx][sy]][point[ex][ey]]=queue[w].step; dis[point[ex][ey]][point[sx][sy]]=queue[w].step; // printf("%d %d %d %d %d %d %d\n",queue[w].step,sx,sy,ex,ey,point[sx][sy],point[ex][ey]); } int prime() { int s=1; int mm=1; bool u[large]; int prim_w=0; int min_w; int flag_point; int low_dis[large]; memset(low_dis,inf,sizeof(low_dis)); memset(u,false,sizeof(u)); u[s]=true; while(1) { if(mm==(flag-1)) break; min_w=inf; for(int j=2;j<=flag-1;j++) { if(!u[j]&&low_dis[j]>dis[s][j]) low_dis[j]=dis[s][j]; if(!u[j]&&min_w>low_dis[j]) { min_w=low_dis[j]; flag_point=j; } } s=flag_point; u[s]=true; prim_w+=min_w; mm++; } return prim_w; } int main () { int j,i,t; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); flag=1; getchar(); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='A'||map[i][j]=='S') { point[i][j]=flag; po[flag].x=i; po[flag].y=j; flag++; } } getchar(); } //printf("%d",flag); for(i=1;i<flag;i++) for(j=i+1;j<flag;j++) { BFS(po[i].x,po[i].y,po[j].x,po[j].y); //printf("%d %d\n",i,j); } cout<<prime()<<endl; } return 0; }