Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9971 | Accepted: 3347 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11 BFS + 最短路的prim算法; 比较坑的是输入数字之后,必须用gets(),不能用getchar()#include <iostream> #include <cmath> #include <cstring> #include <cstdlib> #include <stdio.h> #include <string> #include <stack> #include <queue> #include <algorithm> #include <map> #define WW freopen("a1.txt","w",stdout) using namespace std; const int INF = 0x3f3f3f3f; const int MAX = 110; struct Line { int x; int y; int num; }; char Map[MAX][MAX]; int a[MAX][MAX]; int Dis[MAX][MAX]; int Dir[][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int n,m,top; void BFS(int i,int j)//计算点之间的距离 { bool vis[MAX][MAX]; queue<Line>q; memset(vis,false,sizeof(vis)); Line ans,ant; ans.x=i; ans.y=j; ans.num=0; vis[ans.x][ans.y]=true; q.push(ans); while(!q.empty()) { ant=q.front(); q.pop(); if(a[ant.x][ant.y]!=-1) { Dis[a[i][j]][a[ant.x][ant.y]]=ant.num; } for(int k=0; k<4; k++) { ans.x=ant.x+Dir[k][0]; ans.y=ant.y+Dir[k][1]; if(Map[ans.x][ans.y]=='#'||vis[ans.x][ans.y]) { continue; } ans.num=ant.num+1; vis[ans.x][ans.y]=true; q.push(ans); } } } int dis[MAX]; bool vis[MAX]; int prim() { memset(vis,false,sizeof(vis)); int sum=0; for(int i=1; i<top; i++) { dis[i]=Dis[0][i]; } vis[0]=true; for(int i=1; i<top; i++) { int ans=INF; int flag=-1; for(int j=0; j<top; j++) { if(!vis[j]&&dis[j]<ans) { ans=dis[j]; flag=j; } } if(flag==-1) return -1; vis[flag]=true; sum+=ans; for(int j=0; j<top; j++) { if(!vis[j]&&dis[j]>Dis[flag][j]) { dis[j]=Dis[flag][j]; } } } return sum; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d %d",&m,&n); gets(Map[0]); top=0; memset(a,-1,sizeof(a)); for(int i=0; i<n; i++) { gets(Map[i]); for(int j=0; j<m; j++) { if(Map[i][j]=='S'||Map[i][j]=='A') { a[i][j]=top++; } } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(a[i][j]!=-1) { BFS(i,j); } } } printf("%d\n",prim()); } return 0; }