POJ 3026 广搜+最小生成树

来源:互联网 发布:linux ssh开启 编辑:程序博客网 时间:2024/05/20 13:18

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

//11333524c00h00g3026Accepted680K47MSG++2894B2013-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];//记录距离lowcostint 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;}