poj 3026 Borg Maze( Prim +BFS)

光找bugs ,忘了注册cf 的比赛了,、、、、、

程序一直 TLE ,好是郁闷,搜索 直接把我搞死了

写的搜索太暴力了,改进版,代码太烂了

关键是dist 存路径距离 使搜索 直接降低一个复杂度

View Code
#include<iostream>

#include<cstdio>

#include<queue>

#include<string.h>

const int N =110;

const int inf=999999999;

using namespace std;

struct node

{

    int x,y;

    node(int a=0,int b=0):x(a),y(b){}

}point[N];

int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int  map[N][N],dist[N][N];

char str[N][N];

int top, x,y;

int prim(int n)

{

    int dist[N],vis[N],cnt=0;

    memset(vis,0,sizeof(vis));

    for(int i=0;i<n;i++) dist[i]=map[0][i];

    vis[0]=1;dist[0]=0;

    for(int i=1;i<n;i++)

    {

        int min=inf,pos=-1;

        for(int j=0;j<n;j++)

        {

            if(!vis[j]&&dist[j]<min)

            {

               min=dist[j];pos=j;

            }

        }

        if(min==inf) return -1;

        vis[pos]=1;cnt+=min;

        for(int j=0;j<n;j++)

        {

            if(!vis[j]&&dist[j]>map[pos][j])

            dist[j]=map[pos][j];

        }

    }

    return cnt;

}

void  bfs(node p,int lenj,int leni)

{

    queue <node> que;

    que.push( node(p.x,p.y ));

    dist[p.x][p.y]=0;

    int flag[N][N];

    memset(flag,0,sizeof(flag));

    flag[p.x][p.y]=1;

    while(!que.empty())

    {

        node fg;

        fg=que.front();que.pop();

        for(int i=0;i<4;i++)

        {

            int x=fg.x+dir[i][0],y=fg.y+dir[i][1];

            if(x>=0&&x<leni&&y>=0&&y<lenj&&str[x][y]!='#'&&!flag[x][y])

            {

               que.push(node(x,y));

               dist[x][y]=dist[fg.x][fg.y]+1;

               flag[x][y]=1;

            }

        }

    }



}

void init()

{

    top=1;

    cin>>x>>y; gets(str[0]);

    for(int i=0;i<y;i++)

    {

        gets(str[i]);

        for(int j=0;j<x;j++)

        if(str[i][j]=='A')

            point[top].x=i,point[top++].y=j;

        else if(str[i][j]=='S')

            point[0].x=i,point[0].y=j;

    }

}

void make()

{

    for(int i=0;i<top;i++)

    {

       bfs(point[i],x,y);

       for(int j=0;j<top;j++)

         map[i][j]=dist[point[j].x][point[j].y];

    }

}

int main()

{

    int cs;cin>>cs;

    while(cs--)

    {

      init();

      make();

      cout<<prim(top)<<endl;

    }

    return 0;

}

 

你可能感兴趣的:(Prim)