POJ 3206 Borg Maze(bfs+prim)

来源:互联网 发布:淘宝直通车图片优化 编辑:程序博客网 时间:2024/05/17 22:32

题意:

每次从S点出发,可以一变二,分开走。问最少经过多少步可以遍历完所有的A点

思路:

之前做过一道bfs+dfs的题, 

bfs+dfs- poj2688-Cleaning Robot。

这道题也是一样。一眼看上去就感觉单纯搜索解,一定是无法解决的,因为会有往返,因此就先用bfs进行预处理,造成一个稠密图也就是最小到达点的步骤,然后基于此图构造最小生成树

注意:WA了n多发,无奈去查,发现数据太坑 比如6 5 后面会有很多空格!!

#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <stdio.h>using namespace std;char mp[555][555];int dis[555][555];int vis[555][555];int tag[555][555];const int inf =0x3f3f3f3f;struct node{    int x,y,step;    bool friend operator <(node a,node b)    {        return a.step>b.step;    }}point[505];int w,h,cnt,ans;void bfs(node fir,int pt){    queue <node > s;    fir.step=0;    while(!s.empty())        s.pop();    vis[fir.x][fir.y]=1;    s.push(fir);    while(!s.empty())    {        node t=s.front();        s.pop();        if(mp[t.x][t.y ]=='A'||mp[t.x][t.y]=='S')            dis[ pt][ tag[t.x][t.y] ]=t.step;        int next[4][2  ]={ 0,1,0,-1,1,0,-1,0};        for(int i=0;i<4;i++)        {            node temp=t;            temp.x+=next[i][0];            temp.y+=next[i][1];            if(temp.x<1||temp.y<1||temp.x>h||temp.y>w||vis[temp.x][temp.y]==1||mp[temp.x][temp.y]=='#')            {                continue;            }            temp.step+=1;            s.push(temp);            vis[temp.x][temp.y]=1;        }    }}int dist[505];int vist[505];void prim(int cur){    int sum=0;    for(int i=0;i<=cnt;i++)    {        dist[i]=dis[cur][i];    }    vist[cur]=1;    for(int i=1;i<=cnt;i++)    {        int index=-1;        int minn=inf;        for(int j=1;j<=cnt;j++)        {            if(vist[j]==0&&dist[j]<=minn)            {                minn=dist[j];                index=j;            }        }        vist[index]=1;        sum+=minn;        for(int j=1;j<=cnt;j++)        {            if(vist[j]==0)            {                if(dist[j]>=dis[index][j])                {                    dist[j]=dis[index][j];                }            }        }    } cout<<sum<<endl;}int main(){    int T;    cin>>T;    while(T--)    {    scanf("%d%d",&w,&h);    {        cnt=0;        char ff=getchar();        while(ff==' ' )        {            ff=getchar();        }               memset(mp,0,sizeof(mp));        memset(point,0,sizeof(point));        memset(tag,0,sizeof(tag));        memset(dis,0,sizeof(dis));        memset(vis,0,sizeof(vis));        memset(vist,0,sizeof(vist));        memset(dist,0,sizeof(dist));        for(int i=1;i<=h;i++)        {            for(int j=1;j<=w;j++)                {                char pg=getchar();                mp[i][j]=pg;                // scanf("%c",&mp[i][j]);                if(mp[i][j]=='A')                {                    point[++cnt].x=i;                    point[cnt].y=j;                    tag[i][j]=cnt;                }                else if(mp[i][j]=='S')                {                    tag[i][j]=0;                    point[0].x=i;                    point[0].y=j;                }                }            getchar();        }        for(int i=0;i<=cnt;i++)        {            for(int j=0;j<=cnt;j++)            {                if(i!=j)                    dis[i][j]=inf;                else                    dis[i][j]=0;            }        }        for(int i=0;i<=cnt;i++)        {            memset(vis,0,sizeof(vis));            bfs( point[i],i );        }        memset(vist,0,sizeof(vist));        prim(0);    }    }}


0 0
原创粉丝点击