poj 3026 Borg Maze
BFS+prim
在prim之前很暴力地求出各点之间距离。
要注意只有在A和S处可以分开,题目有描述。
读取x和y后要用gets读取换行符。
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> #define MAXD 51 #define INF 0x3f3f3f3f using namespace std; int N,graph[MAXD][MAXD],dis[MAXD][MAXD],a[MAXD*2][2],x,y,cost[MAXD*2][MAXD*2],e; char data[MAXD][MAXD]; int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}}; void BFS(int src_x,int src_y) { memset(dis,0x3f,sizeof(dis)); dis[src_x][src_y]=0; bool vis[MAXD][MAXD]; memset(vis,0,sizeof(vis)); vis[src_x][src_y]=true; queue<int> que; que.push(x*src_x+src_y); int cur,cur_x,cur_y,next,next_x,next_y,i; while(!que.empty()) { cur=que.front(); cur_x=cur/x; cur_y=cur%x; que.pop(); for(i=0;i<4;i++) { next_x=cur_x+dir[i][0]; next_y=cur_y+dir[i][1]; next=next_x*x+next_y; if(next_x<0||next_x>=y||next_y<0||next_y>=x) continue; if(!graph[next_x][next_y]&&!vis[next_x][next_y]) { vis[next_x][next_y]=true; dis[next_x][next_y]=dis[cur_x][cur_y]+1; que.push(next); } } } } void getcost(int cur) { int i; for(i=0;i<=e;i++) { if(cur==i) continue; cost[cur][i]=dis[a[i][0]][a[i][1]]; } } int MST_PRIM() { int key[MAXD*2]; memset(key,0x3f,sizeof(key)); key[0]=0; bool vis[MAXD*2]; memset(vis,0,sizeof(vis)); vis[0]=true; int i,j; for(i=0;i<=e;i++) key[i]=cost[0][i]; int flag,p,res=0; for(i=1;i<=e;i++) { flag=INF,p=-1; for(j=0;j<=e;j++) { if(!vis[j]&&flag>key[j]) { flag=key[j]; p=j; } } vis[p]=true; res+=flag; for(j=0;j<=e;j++) { if(!vis[j]&&key[j]>cost[p][j]) key[j]=cost[p][j]; } } return res; } int main() { //freopen("test.txt","r",stdin); scanf("%d",&N); int t=N; while(t--) { int i,j; cin >> x >> y; char temp[MAXD]; gets(temp); //需要用gets吃掉cin留下来的换行符 e=0; memset(graph,0,sizeof(graph)); for(i=0;i<y;i++) { gets(data[i]); for(j=0;j<x;j++) { if(data[i][j]=='#') graph[i][j]=1; if(data[i][j]=='S') { a[0][0]=i; a[0][1]=j; } if(data[i][j]=='A') { e++; a[e][0]=i; a[e][1]=j; } } } memset(cost,0,sizeof(cost)); for(i=0;i<=e;i++) { BFS(a[i][0],a[i][1]); getcost(i); } printf("%d\n",MST_PRIM()); } return 0; }