poj 3026 Borg Maze 最小生成树+bfs

来源:互联网 发布:apache httpd安装配置 编辑:程序博客网 时间:2024/05/16 16:00

 

poj 3026 Borg Maze

http://poj.org/problem?id=3026

 

从S点开始,可以出发任意多人开始走,走的相同的路只算一个人的路程,人只能在A点与S点处分开,求S点开始遍历所有A点所经过的最小路程

 

注意m与n后可能有空格,不能用getchar,要用gets………………

 

 

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int INF= 0x3f3f3f3f;char mit[60][60];int n, m, tot, vis[60][60], dis[110][110];int mp[110];int mov[4][2]={1, 0, 0, 1, -1, 0, 0, -1};int link[110], visc[110];struct node{    int x, y, d;};void init(){    int i, j, k;    scanf("%d%d", &n, &m);    gets(mit[0]);    for( i=0; i<m; i++)        gets(mit[i]);    memset( dis, 0, sizeof( dis));    memset( mp, 0, sizeof( mp));    for( i=1, tot=1; i<m-1; i++){        for( j=1; j<n-1; j++)            if( mit[i][j] == 'S' || mit[i][j]== 'A'){                mp[(i-1)*(n-2)+j]= tot++;                //cout<<(i-1)*(n-2)+j<<"  "<<tot<<endl;            }    }}bool check(int x, int y){    if( x>=1 && x<m && y>=1 && y<n && mit[x][y]!= '#' && !vis[x][y])        return true;    else return false;}void bfs(int sx, int sy){    int i, j, k;    node start, head, next;    queue <node > q;    memset( vis, 0, sizeof( vis));    start.x= sx;    start.y= sy;    start.d= 0;    q.push(start);    vis[start.x][start.y]= 1;    while( !q.empty()){        head= q.front();        q.pop();        if( mit[head.x][head.y] == 'A' || mit[head.x][head.y]== 'S'){            dis[mp[(head.x-1)*(n-2) + head.y]][mp[(sx-1)*(n-2)+ sy]]= head.d;          //  cout<<mp[(head.x-1)*(n-2) + head.y]<<"  "<<mp[(sx-1)*(n-2)+ sy]<<"  "<<head.d<<"   ddd"<<endl;        }        next.d= head.d+1;        for( i=0; i<4; i++){            next.x= head.x+ mov[i][0];            next.y= head.y+ mov[i][1];            if( check(next.x , next.y)){                vis[next.x][next.y]= 1;                q.push(next);            }        }    }}int road(){    int i, j, k, t, tmp, num, cnt= (m-2)*(n-2);    memset( link, 0, sizeof(link));    tot--;    for( i=1; i<=tot; i++){        link[i]= dis[1][i];       // cout<<link[i]<<"  ";    }    link[1]= 0;    visc[1]= 1;    link[1]= 0;    num= 0;    for( i=1; i<tot; i++){        t= INF;        for( j=1; j<=tot; j++){            if( !visc[j] && link[j]< t){                tmp= j;                t= link[j];            }        }        visc[tmp]= 1;        num+= t;        for( j=1; j<=tot; j++){            if( !visc[j] && link[j] > dis[tmp][j])                link[j]= dis[tmp][j];        }    }    return num;}int main(){   // freopen("1.txt", "r", stdin);    int i, j, k, T;    scanf("%d", &T);    while( T--){        init();        for( i=1; i<m-1; i++){            for( j=1; j<n-1; j++)                if( mit[i][j] == 'S' || mit[i][j]== 'A'){                    bfs( i, j);                }        }        memset( visc, 0, sizeof( visc));        printf("%d\n", road());    }    return 0;}