zoukankan      html  css  js  c++  java
  • POJ 3206 最小生成树

    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;
    }


  • 相关阅读:
    浏览器从输入URL到渲染出页面发生了什么
    按需加载controller——angular
    依赖注入——angular
    qrcode-reader——二维码识别
    Dynamic Web TWAIN——网页扫描SDK
    WebSocket-Node
    关机命令 shutdown
    datagrid——jQuery EasyUI
    双屏显示——NW.js
    css换行用省略号代替
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4566580.html
Copyright © 2011-2022 走看看