题目大意:让你求从S点到A点的所能达到的最小距离。
算法思路:先通过bfs求出各个字母之间的最短距离,再求最小生成树。
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; #define INF 0x3f3f3f3f typedef struct Node { int x,y; int lev; int sym; }; Node nodes[3000]; char a[300][300]; int edges[300][300]; int dist[3000]; int t; int n,m,ssym,num,sum; int dx[4]={-1,0,1,0}; int dy[4]={0,-1,0,1}; bool visited[300][300],visited2[3003]; int xb[300][300]; void bfs(Node node) { memset(visited,false,sizeof(visited)); queue<Node>que; que.push(node); visited[node.x][node.y]=true; while(!que.empty()) { Node cur=que.front(); que.pop(); for(int i=0;i<4;i++) { int nx=cur.x+dx[i]; int ny=cur.y+dy[i]; if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&!visited[nx][ny]&&a[nx][ny]!='#') { if(a[nx][ny]=='A'||a[nx][ny]=='S') { edges[node.sym][nodes[xb[nx][ny]].sym]=cur.lev+1; } Node flag; flag.x=nx; flag.y=ny; flag.lev=cur.lev+1; visited[nx][ny]=true; que.push(flag); } } } } void prim() { sum=0; int i,j; memset(dist,0x3f,sizeof(dist)); memset(visited2,false,sizeof(visited2)); for(i=1;i<num;i++) { dist[i]=edges[1][i]; } visited2[1]=true; for(i=1;i<num;i++) { int MIN=INF,node=-1; for(j=1;j<num;j++) { if(!visited2[j]&&dist[j]<MIN) { MIN=dist[j]; node=j; } } if(node==-1) return; visited2[node]=true; sum+=dist[node]; for(j=1;j<num;j++) { if(!visited2[j]&&dist[j]>edges[node][j]) { dist[j]=edges[node][j]; } } } } int main() { scanf("%d",&t); int i,j; while(t--) { memset(nodes,0,sizeof(nodes)); memset(xb,0,sizeof(xb)); memset(edges,0,sizeof(edges)); num=1; scanf("%d%d",&m,&n); for(i=0;i<=n;i++) { gets(a[i]+1); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i][j]=='S') { Node node; node.x=i; node.y=j; node.lev=0; ssym=num; node.sym=num; xb[i][j]=num; nodes[num++]=node; } else if(a[i][j]=='A') { Node node; node.x=i; node.y=j; node.lev=0; node.sym=num; xb[i][j]=num; nodes[num++]=node; } } } for(i=1;i<=num;i++) { bfs(nodes[i]); } prim(); printf("%d\n",sum); } }
相关推荐
《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...
根据给定的信息,本文将对POJ 3026 Borg Maze这道题目进行详细的解析,包括题目的背景介绍、核心算法以及实现思路。 ### 题目背景 题目描述了一个来自《星际迷航》中的虚构种族——博格族(Borg)的故事背景。在这...
* 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、poj3026。 * 拓扑排序:例如 poj1094。 * 二分图的最大匹配:例如 poj3041、poj3020。 * 最大流的增广路算法:例如 poj1459、poj3436。...
- **例题**:poj1789, poj2485, poj1258, poj3026 - **解释**:最小生成树算法主要包括Prim算法和Kruskal算法。 ##### (4) 拓扑排序 - **例题**:poj1094 - **解释**:拓扑排序是对有向无环图的一种排序方式,可以...
- (poj1789, poj2485, poj1258, poj3026):介绍普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal),用于寻找加权无向图的最小生成树。 4. **拓扑排序**: - (poj1094):适用于有向无环图(DAG)的一种排序方式,...
- POJ 1258、POJ 3026:Kruskal算法的实际案例。 #### 字符串处理 - **题目示例**: - POJ 3349、POJ 3274:字符串匹配及Hash应用。 - POJ 2151、POJ 1840:利用Hash进行快速查询。 - POJ 2002、POJ 2503:Hash...
### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1789](https://vjudge.net/problem/POJ-1789)、[poj2485](https://vjudge.net/problem/POJ-2485)、[poj1258](https://vjudge.net/problem/POJ-1258)、[poj3026]...
2. **最小生成树**:Prim算法和Kruskal算法,用于构建图的最小生成树(poj1789, poj2485, poj1258, poj3026)。 3. **网络流**:Max-flow算法,用于解决最大流问题(poj1094)。 4. **拓扑排序**:解决有向无环图的...
- poj3026 - **应用场景**:适用于构建最小成本网络、电力线路铺设等问题。 **4. 拓扑排序** - **定义**:对于有向无环图(DAG),拓扑排序是按某种顺序对顶点进行排序,使得对于任意一条从顶点 u 到 v 的边,u 在...
- **示例题目**: poj1789, poj2485, poj1258, poj3026 - **知识点**: - **Prim算法**:适用于稠密图,从任意一个顶点开始构建最小生成树。 - **Kruskal算法**:适用于稀疏图,按照边的权值从小到大依次加入到树中...
* 最小生成树算法:prim、kruskal、POJ1789、POJ2485、POJ1258、POJ3026 * 拓扑排序:POJ1094 * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002...
+ poj1789, poj2485, poj1258, poj3026 * 拓扑排序:poj1094 * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * 最大流的增广路算法:KM算法 + poj1459, poj3436 三、数据结构 * 串:poj1035, poj3080, poj...
6. 最小生成树算法(prim, kruskal)(poj1789, poj2485, poj1258, poj3026) 7. 拓扑排序(poj1094) 8. 串(poj1035, poj3080, poj1936) 9. 哈希表和二分查找等高效查找法(poj3349, poj3274, POJ2151, poj1840, ...
- 示例题目:poj1789, poj2485, poj1258, poj3026 - **Kruskal算法**:适用于稀疏图。 - 示例题目:poj1789, poj2485, poj1258, poj3026 3. **流网络** - 示例题目:poj1094 4. **拓扑排序** - 示例题目:poj...
例题:poj1789、poj2485、poj1258、poj3026。 * 拓扑排序:拓扑排序是指对有向图进行拓扑排序的算法。例题:poj1094。 * 二分图的最大匹配:二分图的最大匹配是指在二分图中寻找最大匹配的算法。例题:poj3041、poj...
- **并查集**:处理集合连接与查询,如 poj3026。 - **哈希表** 和 **二分查找**:提高查找效率,如 poj3349、poj3274。 - **哈夫曼树**:压缩编码,如 poj3253。 - **堆**:用于优先队列和最值问题。 - **Trie...
- 示例题目:POJ 1789, POJ 2485, POJ 1258, POJ 3026 - **网络流**:涉及到最大流、最小割等问题,适用于解决资源分配类问题。 - 示例题目:POJ 1094 - **匹配问题**:如匈牙利算法(Hungarian Method),适用于...
3. 并查集:处理集合合并与查询,如 poj3026。 4. 哈希表和二分查找:高效查找,如 poj3349。 5. 哈夫曼树:用于压缩编码,如 poj3253。 6. 堆:如 poj2299。 7. trie 树:用于字符串搜索,如 poj2513。 四、简单...
3. 并查集:解决集合合并与查询问题,如poj3026。 4. 哈希表和二分查找:高效查找,如poj3274。 5. 哈夫曼树:用于压缩数据,如poj3253。 6. 堆:如poj2299中的堆排序。 7. Trie树:用于字符串搜索,如poj2513。 四...
- POJ 1789, POJ 2485, POJ 1258, POJ 3026 最小生成树是一棵树形结构,它包含了图中的所有顶点,并且使得所有边的权重之和最小。 4. **最大流** - POJ 1094 最大流问题是指在一个流量网络中寻找一条从源点到...