DESCRIPTION:
T_T 在下是读不懂题意的。但是捏。现在知道是求把所有的点(是字母的点)连起来的最小的权值。即最小生成树。因为求最小生成树是不计较源点是哪个的。所以可以把A和S看成一样的。首先需要用BFS广搜算法求出任意两点之间的最短距离。然后直接用prim或kruskal算法模板就欧克了。但是捏。貌似这道题有两大坑。NO.1 输入row 和 col 两个数之后会有多余的空格。所以需要吃掉一个字符串而不是一个字符。NO.2 虽然题目说最多有100个外星人+1个源点。但是好像有102个点。这样的话。数组必须开到>= 102。

23333333....虽然只有这两个坑,但是bfs很混乱的我确实WA了一天多。

附bfs+prim代码。

#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
using namespace std;

const int inf=2501;

char map[51][51];
int node[51][51];
int num;
int edge[102][102];
int x, y;

void bfs(int ii, int jj)
{
    /***initial***/
    int dist[55][55];
    int que_x[2500], que_y[2500];
    int head, tail;
    int move[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
    int vis[55][55];
     memset(vis, 0, sizeof(vis));
     head = 0;
     tail = 0;
     memset(dist, 0, sizeof(dist));

que_x[tail] = ii;
     que_y[tail++] = jj;
     vis[ii][jj] = 1;

while(head < tail)
     {
         int top_x = que_x[head];
         int top_y = que_y[head++];
         if (node[top_x][top_y])
         edge[node[ii][jj]][node[top_x][top_y]] = dist[top_x][top_y];
         for (int k=0; k<4; ++k)
         {
             int next_x = top_x + move[k][0];
             int next_y = top_y + move[k][1];
            if (next_x >= 0 && next_x < y && next_y >= 0 && next_y < x && !vis[next_x][next_y] && map[next_x][next_y] != '#')
             {
                vis[next_x][next_y] = 1;
                dist[next_x][next_y] = dist[top_x][top_y] + 1;
                que_x[tail] = next_x;
                que_y[tail++] = next_y;
             }
         }
     }
     return;
}

int prim(void)
{
    int s=1;
    int m=1;
    bool u[102];
    u[s]=true;

int min_w;
    int prim_w=0;
    int point;
    int low_dis[102];

for(int i=1;i<=num;i++)
    {
        low_dis[i]=inf;
        u[i]=false;
    }

while(true)
    {
        if(m==num)
            break;

min_w=inf;
        for(int i=2;i<=num;i++)
        {
            if(!u[i] && low_dis[i]>edge[s][i])
                low_dis[i] = edge[s][i];
            if(!u[i] && min_w>low_dis[i])
            {
                min_w=low_dis[i];
                point=i;
            }
        }
        s=point;
        u[s]=true;
        prim_w+=min_w;
        m++;
    }
    return prim_w;
}

int main(int i,int j)
{
    int test;
    cin>>test;
    while(test--)
    {
        memset(node,0,sizeof(node));
        num=0;
        cin>>x>>y;
        char temp[20];
        gets(temp);
        for(i=0;i<y;i++)
        {
            gets(map[i]);
            for(j=0;j<x;j++)
            {
                if(map[i][j]=='A'||map[i][j]=='S')
                    node[i][j]=++num;
            }
        }
        for(i=0;i<y;i++)
            for(j=0;j<x;j++)
                if(node[i][j])
                    bfs(i,j);
        cout<<prim()<<endl;
    }
    return 0;
}

POJ 3206 最小生成树的更多相关文章

  1. poj 3522(最小生成树应用)

    题目链接:http://poj.org/problem?id=3522思路:题目要求最小生成树中最大边与最小边的最小差值,由于数据不是很大,我们可以枚举最小生成树的最小边,然后kruskal求最小生成 ...

  2. poj 2349(最小生成树应用)

    题目链接:http://poj.org/problem?id=2349 思路:由于有S个专门的通道,我们可以先求一次最小生成树,然后对于最小生成树上的边从大到小排序,前S-1条边用S-1个卫星通道连接 ...

  3. poj 1258 最小生成树 模板

    POJ 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #in ...

  4. POJ 1258 最小生成树

    23333333333 完全是道水题.因为是偶自己读懂自己做出来的..T_T.prim的模板题水过. DESCRIPTION:John竞选的时候许诺会给村子连网.现在给你任意两个村子之间的距离.让你求 ...

  5. poj 3026 (最小生成树)

    题意:起点开始有超过100个人,总共不会超过100个外星人,问把所有的外星人都搜出来花的最小时间.一条路径上的时间跟人数是无关的,只跟路径长度有关. 思路:刚开始人都在起点,当派一定人数去最近的外星人 ...

  6. The Unique MST POJ - 1679 最小生成树判重

    题意:求一个无向图的最小生成树,如果有多个最优解,输出"Not Unique!" 题解: 考虑kruskal碰到权值相同的边: 假设点3通过边(1,3)连入当前所维护的并查集s. ...

  7. POJ 2485 最小生成树

    2333333333 又是水题.prim模板直接水过.求最小生成树里的最大的边的权值. 附代码:// 如果我木猜错的话.是要求最小生成树的最大边值. #include<stdio.h>#i ...

  8. Arctic Network POJ 2349 (最小生成树思想)

    Description The Department of National Defence (DND) wishes to connect several northern outposts by ...

  9. Poj(2560),最小生成树,Prim

    题目链接:http://poj.org/problem?id=2560 只想说“全都是套路”,关键建图. #include <stdio.h> #include <string.h& ...

随机推荐

  1. Hibernate4集成 Annotation使用教程

    Spring4 MVC Hibernate4集成 Annotation 一.    本文所用环境 Spring4.0.3.RELEASE.Hibernate4.3.5.Final.Mysql 二.   ...

  2. 转 C编译: 使用gdb调试

    C编译: 使用gdb调试   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! gdb是the GNU Debugger的简称.它是 ...

  3. SecureCRT显示中文和语法高亮

    因为默认情况下,SecureCRT不能显示语法高亮特性,整个界面颜色单一,看起来不爽,也没有效率,所有通过设置一下语法高亮还是很有必要的, 默认字体也看着不是很清晰,还是更改为我比较喜欢的Courie ...

  4. ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程

    题意:给定N(1<= N <=64)个盘子和M(4<= M <= 65)根柱子,问把N个盘子从1号柱子移动到M号柱子所需要的最少步数,并且输出移动过程. 分析:设f[i][j] ...

  5. Android 四种简单的动画(淡入淡出、旋转、移动、缩放效果)

    最近在Android开发当中,用到的动画效果. public void onClick(View arg0) { // TODO 自动生成的方法存根 switch (arg0.getId()) { c ...

  6. 【Todo】Zookeeper学习

    首先,Zookeeper是基于Paxos来进行分布式选举管理的,Paxos的内容可以参考我另一篇文章:http://www.cnblogs.com/charlesblc/p/6037004.html ...

  7. iOS 的 Safari 文件上传功能详解

    iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...

  8. control file sequential read 等待事件

    可能的原因 control file sequential read Reading from the control file. This happens in many cases. For ex ...

  9. C\C++头文件说明

    C\C++编程时候经常会遇到头文件问题而出现一系列的调试错误,下面我就简要的举例介绍一下头文件的作用,我们知道一个C\C++ 程序中开头一般都为: #include<iostream.h> ...

  10. xUtils更新到3.0后的基本使用规则

    说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的 ...