POJ 3026 广搜+最小生成树

这道题目真是太麻烦了,设置了好多变量。对了,还参考了discuss中的空格的问题。

//11333524	c00h00g	3026	Accepted	680K	47MS	G++	2894B	2013-03-10 14:35:03
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<string.h>
using namespace std;
#define INF 0x7fffffff
//字符矩阵 
char mat[55][55];
int x,y,n,k;
struct Node{
    int x,y;
};
//A之间的距离 
int dist[102][102];
//广搜过程中记录点是否访问过 
int vis[55][55];
//方向数组 
int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
//记录某个位置对应node节点的下标 
int index[55][55]; 
//广搜的过程中记录距离
int dd[55][55];
//记录距离lowcost
int lowcost[102];
int visited[102];

queue<Node> q;

void bfs(Node nd){
    q.push(nd);
    memset(vis,0,sizeof(vis));
    dd[nd.x][nd.y]=0;
    vis[nd.x][nd.y]=1;
    while(!q.empty()){
        Node tmp=q.front();q.pop();
        for(int i=0;i<4;i++){
            int xx=tmp.x+dir[i][0];
            int yy=tmp.y+dir[i][1];
            if(xx>=0&&xx<y&&yy>=0&&yy<x&&(mat[xx][yy]=='A'||mat[xx][yy]==' '||mat[xx][yy]=='S')&&vis[xx][yy]==0){
                dd[xx][yy]=dd[tmp.x][tmp.y]+1;
                vis[xx][yy]=1;
                if(mat[xx][yy]=='A'||mat[xx][yy]=='S'){
                    dist[index[nd.x][nd.y]][index[xx][yy]]=dd[xx][yy];
                    dist[index[xx][yy]][index[nd.x][nd.y]]=dd[xx][yy];
                }
                Node ne;ne.x=xx;ne.y=yy;
                q.push(ne);
            }
        } 
    }
}
//起点设置为0 
int prim(){
    int res=0,Min;
    memset(visited,0,sizeof(visited));
    visited[0]=1;
    for(int i=1;i<k;i++)
        lowcost[i]=dist[0][i];
    
    int v;
    for(int i=1;i<k;i++){
        Min=INF;
        for(int j=1;j<k;j++)
            if(lowcost[j]<Min&&!visited[j]){
                Min=lowcost[j];
                v=j;
            }
        res+=Min;
        visited[v]=1;
        for(int j=1;j<k;j++)
            if(lowcost[j]>dist[v][j]&&!visited[j])
                lowcost[j]=dist[v][j];
    }
    return res;
}
int main(){
    char aa[100];
    while(scanf("%d",&n)!=EOF){
        while(n--){
            k=0;
            scanf("%d%d",&x,&y);gets(aa);
            for(int i=0;i<y;i++){
                for(int j=0;j<x;j++){
                    scanf("%c",&mat[i][j]);
                    if(mat[i][j]=='A'||mat[i][j]=='S'){
                        index[i][j]=k;
                        k++;
                    }
                }
                getchar();
            }
        
        /*for(int i=0;i<y;i++){
            for(int j=0;j<x;j++)
                printf("%c",mat[i][j]);
            printf("\n");
        }*/
        for(int i=0;i<k;i++)
           for(int j=0;j<k;j++)
               dist[i][j]=((i==j)?0:INF);
        //开始bfs
        for(int i=0;i<y;i++)
            for(int j=0;j<x;j++)
                if(mat[i][j]=='A'||mat[i][j]=='S'){
                    Node tmp;tmp.x=i;tmp.y=j;
                    bfs(tmp);
                }
        printf("%d\n",prim());
      }
    }
    //system("pause");
    return 0;
} 

你可能感兴趣的:(POJ 3026 广搜+最小生成树)