poj 3026 Borg Maze 最小生成树prim

来源:互联网 发布:王伟 知乎 编辑:程序博客网 时间:2024/05/03 07:55
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int inf=0x3f3f3f3f;const int N=4048;char mp[300][300];int ans,cnt,p[300][300],e[4048][4048],vis[300][300];int dx[]= {0,0,1,-1};int dy[]= {-1,1,0,0};int n,m;struct node{    int x,y,d;} tp,t;void bfs(int x,int y){    int i,j;    t.x=x;    t.y=y;    t.d=0;    memset(vis,0,sizeof(vis));    queue<node>q;    q.push(t);    vis[x][y]=1;    while(!q.empty())    {        t=q.front();        q.pop();        for(i=0; i<4; i++)        {            tp.x=t.x+dx[i];            tp.y=t.y+dy[i];            tp.d=t.d+1;            if(tp.x<0||tp.x>=n||tp.y<0||tp.y>=m) continue;            if(mp[tp.x][tp.y]=='#') continue;            if(mp[tp.x][tp.y]=='A'||mp[tp.x][tp.y]=='S')            {                int u=p[x][y],v=p[tp.x][tp.y];                if(tp.d<e[u][v])                    e[u][v]=e[v][u]=tp.d;            }            if(vis[tp.x][tp.y]==1) continue;            vis[tp.x][tp.y]=1;            q.push(tp);        }    }}int prim(int tol){    bool vis[N];    int dis[N];    int i,j,u,v,w,ans=0;    for(i=0; i<=tol; i++)        dis[i]=e[0][i];    memset(vis,0,sizeof(vis));    vis[0]=1;    for(i=1; i<tol; i++)    {        w=inf;        u=-1;        for(j=1; j<tol; j++) if(!vis[j]&&w>dis[j]) w=dis[j],u=j;        vis[u]=1;        ans+=w;        for(v=0; v<tol; v++)            if(!vis[v])                if(dis[v]>e[u][v]) dis[v]=e[u][v];    }    return ans;}int main(){    int _,i,j,st;    char tmp[1024];    scanf("%d",&_);    while(_--)    {        scanf("%d%d",&m,&n);        gets(tmp);         cnt=1;        for(i=0; i<n; i++)        {            gets(mp[i]);            for(j=0; j<m; j++)            {                if(mp[i][j]=='S')                    p[i][j]=0;                else if(mp[i][j]=='A')                    p[i][j]=cnt++;            }        }        ans=0;        for(i=0; i<cnt; i++)            for(j=0; j<cnt; j++)                e[i][j]=inf;        for(i=0; i<n; i++)            for(j=0; j<m; j++)                if(mp[i][j]=='S'||mp[i][j]=='A')                    bfs(i,j);        //cout<<cnt<<endl;        printf("%d\n",prim(cnt));    }    return 0;}
0 0
原创粉丝点击