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

题意:在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度。
题解:一格的长度为1,而且移动的方法只有上、下、左、右,所以在无任何墙的情况下(根据题意的“分离”规则,重复走过的路不再计算因此当使用prim算法求L的长度时,根据算法的特征恰好不用考虑这个问题(源点合并很好地解决了这个问题),L就是最少生成树的总权值W由于使用prim算法求在最小生成树,因此无论哪个点做起点都是一样的,(通常选取第一个点),因此起点不是S也没有关系所以所有的A和S都可以一视同仁,看成一模一样的顶点就可以了剩下的问题关键就是处理 任意两字母间的最短距离,由于存在了“墙#” ,这个距离不可能单纯地利用坐标加减去计算,必须额外考虑,推荐用BFS(广搜、宽搜),这是本题的唯一难点,因为prim根本直接套用就可以了。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>s
#include<queue>
#include<string>
#define INF 10000000
using namespace std;
int xn,yn,top,pos;
int n,m;
char map[][];
int dist[][],lowcost[],g[][],visit[][];
struct Node{
int x;
int y;
int step;
};
struct Node1{
int x;
int y;
}node[];
void init(){
for(int i=;i<=xn;i++)
for(int j=;j<=yn;j++)
dist[i][j]=INF;
memset(visit,,sizeof(visit));
}
void bfs(Node1 a){
init();
dist[a.x][a.y]=;
queue<Node>Q;
Node temp;
temp.x=a.x;
temp.y=a.y;
temp.step=;
visit[a.x][a.y]=true;
Q.push(temp);
while(!Q.empty()){
Node tmp=Q.front();
Q.pop();
int x=tmp.x;
int y=tmp.y;
if(x>=&&map[x-][y]!='#'&&!visit[x-][y]){
visit[x-][y]=true;//bfs收索时候,一定要在入队之前标记,如果在出队
dist[x-][y]=tmp.step+;//时在标记,会使得一个元素在队列中可能会被加入多次。
temp.x=x-;
temp.y=y;
temp.step=tmp.step+;
Q.push(temp);
}
if(x<xn&&map[x+][y]!='#'&&!visit[x+][y]){
visit[x+][y]=true;
dist[x+][y]=tmp.step+;
temp.x=x+;
temp.y=y;
temp.step=tmp.step+;
Q.push(temp);
}
if(y>=&&map[x][y-]!='#'&&!visit[x][y-]){
visit[x][y-]=true;
dist[x][y-]=tmp.step+;
temp.x=x;
temp.y=y-;
temp.step=tmp.step+;
Q.push(temp);
}
if(y<yn&&map[x][y+]!='#'&&!visit[x][y+]){
visit[x][y+]=true;
dist[x][y+]=tmp.step+;
temp.x=x;
temp.y=y+;
temp.step=tmp.step+;
Q.push(temp);
}
}
}
void prim(int v0){
int sum=;
for(int i=;i<top;i++){
lowcost[i]=g[v0][i];
}
lowcost[v0]=-;
for(int i=;i<top-;i++){
int min=INF;
int v=-;
for(int j=;j<top;j++){
if(lowcost[j]<min&&lowcost[j]!=-){
min=lowcost[j];
v=j;
}
}
if(v!=-){
sum+=lowcost[v];
lowcost[v]=-;
for(int k=;k<top;k++)
if(lowcost[k]!=-&&g[v][k]<lowcost[k])
lowcost[k]=g[v][k];
}
}
printf("%d\n",sum);
}
int main(){
int cas;string line;
scanf("%d",&cas);
char sss[];
while(cas--){
top=;
scanf("%d%d",&yn,&xn);
gets(sss);//这里如果用gethchar()oj会判wa
for(int i=;i<=xn;i++){
getline(cin,line);//读取一整行 for(int j=;j<=yn;j++){
map[i][j]=line[j-];
if(map[i][j]!=' '&&map[i][j]!='#'){//记录每个A和S
node[top].x=i;
node[top++].y=j;
}
if(map[i][j]=='S'){//记录起点
pos=top-;
}
}
}
for(int i=;i<top;i++){
bfs(node[i]);//一遍bfs找出了所有其他点与改点的距离
for(int j=i+;j<top;j++){//建边
g[i][j]=g[j][i]=dist[node[j].x][node[j].y];
}
}
for(int i=;i<top;i++)//初始化
for(int j=;j<top;j++){
if(i==j)g[i][j]=;
else if(g[i][j]==)g[i][j]=INF;
}
prim(pos);
}
}

Borg Maze的更多相关文章

  1. Borg Maze(MST & bfs)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9220   Accepted: 3087 Descrip ...

  2. POJ 3026 : Borg Maze(BFS + Prim)

    http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  3. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

  4. POJ 3026 Borg Maze (最小生成树)

    Borg Maze 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/I Description The Borg is an im ...

  5. POJ 3026 Borg Maze(bfs+最小生成树)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6634   Accepted: 2240 Descrip ...

  6. poj 3026 Borg Maze (BFS + Prim)

    http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS     Memory Limit:65536KB     64bit IO For ...

  7. POJ 3026 Borg Maze

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7998   Accepted: 2675 Descrip ...

  8. POJ3026——Borg Maze(BFS+最小生成树)

    Borg Maze DescriptionThe Borg is an immensely powerful race of enhanced humanoids from the delta qua ...

  9. POJ3026 Borg Maze 2017-04-21 16:02 50人阅读 评论(0) 收藏

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14165   Accepted: 4619 Descri ...

  10. Borg Maze(BFS+MST)

    Borg Maze http://poj.org/problem?id=3026 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

随机推荐

  1. codechef Turbo Sort 题解

    Input t – the number of numbers in list, then t lines follow [t <= 10^6].  Each line contains one ...

  2. jquery做个日期选择适用于手机端

    第一步:做个 文本框用于显示年月日的 第二步:点击文本框触发bootstrap模态框并显示 第三步:我是建一个外部js页面写的 js中获得当前时间是年份和月份,形如:201208       //获取 ...

  3. OCCI处理CHAR类型字符串变量的不同

    问题背景: 一个旧应用,原先应用是用proc写的,9i的库,如今应用须要改为使用OCCI,当中有一段查询逻辑:select ... where upper(state)=upper(:1). (此处请 ...

  4. iOS开发中关于UIImage的知识点总结

    UIImage是iOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有 CGImage,以及iOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: image ...

  5. linux下daemon守护进程的实现(以nginx代码为例)

    ngx_int_t ngx_daemon(ngx_log_t *log) { int fd; // 让init进程成为新产生进程的父进程: // 调用fork函数创建子进程后,使父进程立即退出.这样, ...

  6. Qt 学习之路:元素布局

    上一章我们介绍了 QML 中用于定位的几种元素,被称为定位器.除了定位器,QML 还提供了另外一种用于布局的机制.我们将这种机制成为锚点(anchor).锚点允许我们灵活地设置两个元素的相对位置.它使 ...

  7. git subproject commit xxxxxxxxxxxxxxxxxxxxx -dirty

    -Subproject commit 8c75e65b647238febd0257658b150f717a136359 +Subproject commit 8c75e65b647238febd025 ...

  8. 10.7 noip模拟试题

    楼[问题背景]zhx 为他的妹子造了一幢摩天楼.[问题描述]zhx 有一幢摩天楼. 摩天楼上面有 M 个观光电梯,每个观光电梯被两个整数

  9. css兼容性问题

    其实做网页最大的问题还是兼容性吧,要调试IE的各种浏览器. DIV+CSS设计IE6.IE7.FF 兼容性  DIV+CSS网页布局这是一种趋势,我也开始顺应这股趋势了,不过在使用DIV+CSS网站设 ...

  10. discuz论坛几种安全策略(一)

    安全问题 最近公司准备搭建一个discuz论坛,大头让我调研一下discuz的安全策略,并提出如下几点要求: 1.防止php上传漏洞2.防止大量刷新攻击限制某个IP大量刷新某一页面导致论坛宕机3.防止 ...