题目链接:http://poj.org/problem?id=3026
题意:从S到所有A的最小生成树
错误点分析:题意理解;读入n,m的时候后面有很多空格;BFS+最小生成树
分类:BFS+最小生成树
代码:
#include<stdio.h> #include<string.h> #include<ctype.h> #include<queue> #define MAX 0x3f3f3f3f #include<iostream> using namespace std; int n,m; int len; int ans; struct { int x,y; }A[305]; char s[300][300]; int vis[300][300]; int map[305][305]; int dir[4][2]={1,0,0,1,-1,0,0,-1}; struct P { int x,y,step; }; queue <P> que; void BFS(int ii,int jj) { int i,j; int cur; for(i=1;i<=len;i++) { if(A[i].x==ii&&A[i].y==jj) { cur=i; break; } } P p; p.x=ii; p.y=jj; p.step=0; que.push(p); while(!que.empty()) { P p=que.front(); vis[ii][jj]=1; for(i=0;i<4;i++) { int tempx,tempy; tempx=p.x+dir[i][0]; tempy=p.y+dir[i][1]; if(tempx>=0&&tempx<n&&tempy>=0&&tempy<m&&!vis[tempx][tempy]&&s[tempx][tempy]!='#') { P tmp; tmp.x=tempx; tmp.y=tempy; tmp.step=p.step+1; vis[tempx][tempy]=1; if(isalpha(s[tempx][tempy])) { int curr; for(j=1;j<=len;j++) { if(A[j].x==tempx&&A[j].y==tempy) { curr=j; break; } } map[cur][curr]=tmp.step; } que.push(tmp); } } que.pop(); } } int prime() { int i,j,pos,Min; int vi[len+5],low[len+5]; memset(vi,0,sizeof(vi)); vi[1]=1; pos=1; for(i=1;i<=len;i++) { if(i!=pos) low[i]=map[pos][i]; } for(i=1;i<len;i++) { Min=MAX; for(j=1;j<=len;j++) { if(!vi[j]&&Min>low[j]) { pos=j; Min=low[j]; } } ans+=Min; vi[pos]=1; for(j=1;j<=len;j++) { if(!vi[j]&&low[j]>map[pos][j]) { low[j]=map[pos][j]; } } } return ans; } int main() { int t; scanf("%d",&t); getchar(); while(t--) { ans=len=0; char ss[300]; gets(ss); getchar(); int haha = 0; n = m = 0; for(int i=0;i<strlen(ss);i++) { if(isdigit(ss[i])) { if(!haha) { m = m * 10 + ss[i] - '0'; } else { n = n * 10 + ss[i] - '0'; } } else haha = 1; } int i,j; for(i=0;i<n;i++) { gets(s[i]); } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(isalpha(s[i][j])) { ++len; A[len].x=i; A[len].y=j; } } } for(i=1;i<=len;i++) { for(j=1;j<=len;j++) { map[i][j]=MAX; } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(isalpha(s[i][j])) { memset(vis,0,sizeof(vis)); BFS(i,j); } } } printf("%d ",prime()); } return 0; }