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. 编码实现Spring 利用@Resource注解实现bean的注入,xml实现基本数据类型的注入

    首先分析. 1: 肯定要利用dom4j读取xml配置文件,将所有的bean的配置信息读取出来 2: 利用反射技术,实例化所有的bean 3: 写注解处理器, 利用注解和内省实现依赖对象的注入. 4: ...

  2. 个人阅读作业 The Last

    对于软件工程M1/M2的总结: 假象-MO 在团队开发的前期,我感觉自己其实给了自己很多的期待,因为一直希望着自己可以在团队中担任一个角色,用自己的力量为团队多做事情,也给了其他人一些假象,那就是看起 ...

  3. iOS - Swift 命令行输入输出

    1.类输出 Swift 语言中类输出方法重: override var description: String{ return String(format: "%@, %@", s ...

  4. spring DI原理

    什么是IOC? 也称依赖注入 当一个类,需要另一个类的时候,我们不需要再另一个类里进行创建 对象,spring容器会给我们自动的创建 IOC的实现? 通过一定的技术读取spring.xml文件信息,比 ...

  5. VB6.0

    1. 安装包来自 http://msdn.itellyou.cn/ 下载的文件为: sc_vb6_ent_cd1.iso sc_vb6_ent_cd2.iso 2.安装时,"请输入产品的 I ...

  6. Mybatis 的分页插件PageHelper-4.1.1的使用

    Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschin ...

  7. OpenGL的GLUT事件处理(Event Processing)窗口管理(Window Management)函数[转]

    GLUT事件处理(Event Processing)窗口管理(Window Management)函数 void glutMainLoop(void) 让glut程序进入事件循环.在一个glut程序中 ...

  8. 解决Win7中第一次HttpWebRequest连接缓慢、超时等问题

    在使用HttpWebRequest的时候发现,第一次连接需要15S左右,我的系统是win7,很崩溃,除了我那个用户可以等待的了,但是第二次,就没有问题了,于是百度之...... http://www. ...

  9. 有用的dede表单代码

    <form action="" class="demoform">                <table>             ...

  10. 【vijos1266】搜集环盖

    题意 百事任何饮料的瓶盖上都会有一个百事球星的名字. 假设有\(n\)个不同的球星名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢? 分析 设凑齐\(i\)个球星的期望次数为\(f ...