7.22 S POJ 3026 Borg Maze

来源:互联网 发布:java开平方函数 编辑:程序博客网 时间:2024/06/18 04:02

题意:在n*m的有障碍点阵中,任意两点可以连线,求使所有点连通,且权值和最小。

思路:直接bfs是不行的,还是想到最小生成树。只是不知道点与点之间的距离,想到用bfs求一点到其他点的最小距离。

代码:

//coder:OX_louis#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;#define MP(a,b) make_pair(a,b)#define pr(x) cout << #x << ": " << x << "  "#define pl(x) cout << #x << ": " << x << endl;#define pri(a) printf("%d\n",(a))#define xx first#define yy second#define sa(n) scanf("%d", &(n))#define sai(n) scanf("%I64d", &(n))#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)#define rep(i,a,b) for(int (i)=(a); (i)<(b); (i)++)#define per(i,a,b) for(int (i)=(b)-1; (i)>=(a); (i)--)#define CLR(a,i) memset((a),(i),sizeof(a))char mp[301][301];int  u[20000],v[20000],w[20000],r[20000],rods,p[2700];int find(int x) {return x==p[x]?x:p[x]=find(p[x]);}int step[301][301];struct node{    int i,j;}que[20000];int n,m;int mi[]={0,0,1,-1};int mj[]={1,-1,0,0};int cmp(int a,int b){    return w[a]<w[b];}void bfs(int bi,int bj){    int hed=0,tal=0;    CLR(step,-1);    node st; st.i=bi; st.j=bj;    step[bi][bj]=0;    que[tal++]=st;    while(tal>hed){        node nw=que[hed++],nx;        rep(i,0,4){            nx.i=nw.i+mi[i];            nx.j=nw.j+mj[i];            if(nx.i<0||nx.i>=n||nx.j<0||nx.j>=m)continue;            if(mp[nx.i][nx.j]=='#'||step[nx.i][nx.j]>=0)continue;            step[nx.i][nx.j]=step[nw.i][nw.j]+1;            if(isalpha(mp[nx.i][nx.j])){                u[rods]=bi+bj*50;                v[rods]=nx.i+nx.j*50;                w[rods]=step[nx.i][nx.j];                rods++;            }            que[tal++]=nx;        }    }}int Kruskal(){    int ans=0;    rep(i,0,2600) p[i]=i;    rep(i,0,rods) r[i]=i;    sort(r,r+rods,cmp);    rep(i,0,rods){        int e=r[i], x=find(u[e]), y=find(v[e]);        if(x!=y){            ans+=w[e];            p[x]=y;        }    }    return ans;}int main(){    int T; sa(T);    while(T--){        sa(m); sa(n);        gets(mp[0]);        rep(i,0,n)            gets(mp[i]);        rods=0;        rep(i,0,n)        rep(j,0,m){            if(isalpha(mp[i][j])){                bfs(i,j);            }        }        pri(Kruskal());    }    return 0;}

0 0
原创粉丝点击