Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7998 | Accepted: 2675 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
最小生成树问题,主要是要求出点点距离,即字母间边权,这里用BFS求出了边权,用prim算法求出了最小生成树路径。
AC代码如下:
<pre name="code" class="cpp">#include<iostream> #include<queue> #include<cstring> #include<cstdio> #define inf 100000 using namespace std; char map[60][60]; int vis[60][60],v[60][60]; int n,m,tt,ans; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; struct H { int h,z; }a[10005]; int w[251][251],lc[251],vv[60][60];//W是边权记录,LCprim算法运用,VV记录第几个字母的坐标 struct HH { int h,z,st; }; int bfs(int h,int z) { int i; v[h][z]=1; queue <HH> q; HH a,b,c; a.h=h; a.z=z; a.st=0; q.push(a); while(!q.empty()) { b=q.front(); q.pop(); if(vv[b.h][b.z])//统计边权 { w[vv[h][z]][vv[b.h][b.z]]=b.st; w[vv[b.h][b.z]][vv[h][z]]=b.st; //cout<<vv[h][z]<<" "<<vv[b.h][b.z]<<" "<<b.st<<endl; } for(i=0;i<4;i++) { c.h=b.h+dx[i]; c.z=b.z+dy[i]; if(c.h>=0&&c.h<n&&c.z>=0&&c.z<m&&map[c.h][c.z]!='#'&&!v[c.h][c.z]) { v[c.h][c.z]=1; c.st=b.st+1; q.push(c); } } } } void prim() { int i,j; int m,id; for(i=1;i<tt;i++) { lc[i]=w[1][i]; } lc[1]=0; for(j=1;j<tt-1;j++) { m=inf; for(i=1;i<tt;i++) if(lc[i]!=0&&lc[i]<m) {m=lc[i];id=i;} ans+=m; lc[id]=0; for(i=1;i<tt;i++) { if(lc[i]!=0&&lc[i]>w[id][i]) lc[i]=w[id][i]; } } } int main() { int i,j,l; int t; char c[10]; scanf("%d",&t); gets(c); while(t--) { tt=1; memset(vis,0,sizeof vis ); cin>>m>>n; gets(c); for(i=0;i<n;i++) gets(map[i]); //for(i=0;i<n;i++) //cout<<map[i]<<endl; int bj=0; memset(vv,0,sizeof vv); for(i=0;i<n;i++) { for(j=0;j<m;j++) if(map[i][j]=='A'||map[i][j]=='S') { vv[i][j]=tt++;//记录字母序号及个数 } } for(i=1;i<tt;i++) for(j=1;j<=i;j++) if(i==j) w[i][j]=0; else { w[i][j]=inf; w[j][i]=inf; } for(i=0;i<n;i++) for(j=0;j<m;j++) { if((map[i][j]=='A'||map[i][j]=='S')&&!vis[i][j]) { vis[i][j]=1; memset(v,0,sizeof v); bfs(i,j);//求出这个字母到各个字母产生的边权 } } ans=0; prim();//prim算法的运用 cout<<ans<<endl; } return 0; }
POJ 3026 Borg Maze,布布扣,bubuko.com
原文地址:http://blog.csdn.net/hanhai768/article/details/37654705