`
huyifan951124
  • 浏览: 82974 次
社区版块
存档分类
最新评论

poj3026

 
阅读更多

题目大意:让你求从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】

    《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...

    POJ 3026 Borg Maze解题报告

    根据给定的信息,本文将对POJ 3026 Borg Maze这道题目进行详细的解析,包括题目的背景介绍、核心算法以及实现思路。 ### 题目背景 题目描述了一个来自《星际迷航》中的虚构种族——博格族(Borg)的故事背景。在这...

    poj题目分类

    * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、poj3026。 * 拓扑排序:例如 poj1094。 * 二分图的最大匹配:例如 poj3041、poj3020。 * 最大流的增广路算法:例如 poj1459、poj3436。...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1789, poj2485, poj1258, poj3026 - **解释**:最小生成树算法主要包括Prim算法和Kruskal算法。 ##### (4) 拓扑排序 - **例题**:poj1094 - **解释**:拓扑排序是对有向无环图的一种排序方式,可以...

    acm训练计划(poj的题)

    - (poj1789, poj2485, poj1258, poj3026):介绍普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal),用于寻找加权无向图的最小生成树。 4. **拓扑排序**: - (poj1094):适用于有向无环图(DAG)的一种排序方式,...

    经典 的POJ 分类

    - POJ 1258、POJ 3026:Kruskal算法的实际案例。 #### 字符串处理 - **题目示例**: - POJ 3349、POJ 3274:字符串匹配及Hash应用。 - POJ 2151、POJ 1840:利用Hash进行快速查询。 - POJ 2002、POJ 2503:Hash...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1789](https://vjudge.net/problem/POJ-1789)、[poj2485](https://vjudge.net/problem/POJ-2485)、[poj1258](https://vjudge.net/problem/POJ-1258)、[poj3026]...

    ACM-POJ 算法训练指南

    2. **最小生成树**:Prim算法和Kruskal算法,用于构建图的最小生成树(poj1789, poj2485, poj1258, poj3026)。 3. **网络流**:Max-flow算法,用于解决最大流问题(poj1094)。 4. **拓扑排序**:解决有向无环图的...

    POJ 分类题目

    - poj3026 - **应用场景**:适用于构建最小成本网络、电力线路铺设等问题。 **4. 拓扑排序** - **定义**:对于有向无环图(DAG),拓扑排序是按某种顺序对顶点进行排序,使得对于任意一条从顶点 u 到 v 的边,u 在...

    POJ题目分类

    - **示例题目**: poj1789, poj2485, poj1258, poj3026 - **知识点**: - **Prim算法**:适用于稠密图,从任意一个顶点开始构建最小生成树。 - **Kruskal算法**:适用于稀疏图,按照边的权值从小到大依次加入到树中...

    ACMer需要掌握的算法讲解 (2).docx

    * 最小生成树算法:prim、kruskal、POJ1789、POJ2485、POJ1258、POJ3026 * 拓扑排序:POJ1094 * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002...

    ACM常用算法及其相应的练习题.docx

    + poj1789, poj2485, poj1258, poj3026 * 拓扑排序:poj1094 * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * 最大流的增广路算法:KM算法 + poj1459, poj3436 三、数据结构 * 串:poj1035, poj3080, poj...

    ACMer需要掌握的算法讲解.docx

    6. 最小生成树算法(prim, kruskal)(poj1789, poj2485, poj1258, poj3026) 7. 拓扑排序(poj1094) 8. 串(poj1035, poj3080, poj1936) 9. 哈希表和二分查找等高效查找法(poj3349, poj3274, POJ2151, poj1840, ...

    ACM 题型

    - 示例题目:poj1789, poj2485, poj1258, poj3026 - **Kruskal算法**:适用于稀疏图。 - 示例题目:poj1789, poj2485, poj1258, poj3026 3. **流网络** - 示例题目:poj1094 4. **拓扑排序** - 示例题目:poj...

    ACM常用算法及其相应的练习题 (2).pdf

    例题:poj1789、poj2485、poj1258、poj3026。 * 拓扑排序:拓扑排序是指对有向图进行拓扑排序的算法。例题:poj1094。 * 二分图的最大匹配:二分图的最大匹配是指在二分图中寻找最大匹配的算法。例题:poj3041、poj...

    ACM 经验 笔记 很有用的经验指导

    - **并查集**:处理集合连接与查询,如 poj3026。 - **哈希表** 和 **二分查找**:提高查找效率,如 poj3349、poj3274。 - **哈夫曼树**:压缩编码,如 poj3253。 - **堆**:用于优先队列和最值问题。 - **Trie...

    ACM 新手指南 PKU 题目分类

    - 示例题目:POJ 1789, POJ 2485, POJ 1258, POJ 3026 - **网络流**:涉及到最大流、最小割等问题,适用于解决资源分配类问题。 - 示例题目:POJ 1094 - **匹配问题**:如匈牙利算法(Hungarian Method),适用于...

    北大acm试题分类.doc

    3. 并查集:处理集合合并与查询,如 poj3026。 4. 哈希表和二分查找:高效查找,如 poj3349。 5. 哈夫曼树:用于压缩编码,如 poj3253。 6. 堆:如 poj2299。 7. trie 树:用于字符串搜索,如 poj2513。 四、简单...

    ACM训练方案

    3. 并查集:解决集合合并与查询问题,如poj3026。 4. 哈希表和二分查找:高效查找,如poj3274。 5. 哈夫曼树:用于压缩数据,如poj3253。 6. 堆:如poj2299中的堆排序。 7. Trie树:用于字符串搜索,如poj2513。 四...

    北大、杭电ACM试题分类

    - POJ 1789, POJ 2485, POJ 1258, POJ 3026 最小生成树是一棵树形结构,它包含了图中的所有顶点,并且使得所有边的权重之和最小。 4. **最大流** - POJ 1094 最大流问题是指在一个流量网络中寻找一条从源点到...

Global site tag (gtag.js) - Google Analytics