zoukankan      html  css  js  c++  java
  • poj3026

    最小生成树,要注意多余的空格(包括x,y那行)

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;

    #define maxn 105
    #define inf 0x3f3f3f3f

    struct Point
    {
    int x, y;
    } point[maxn], q[maxn
    * maxn];

    int n, m;
    bool map[maxn][maxn];
    int dist[maxn][maxn];
    char st[maxn][maxn];
    int tot;
    int dir[4][2] =
    {
    {
    0, 1 },
    {
    1, 0 },
    {
    -1, 0 },
    {
    0, -1 } };
    int vis[maxn];
    int lowc[maxn];
    int cost[maxn][maxn];

    void input()
    {
    scanf(
    "%d%d", &m, &n);
    gets(st[
    0]);
    for (int i = 0; i < n; i++)
    gets(st[i]);
    tot
    = 1;
    for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
    {
    if (st[i][j] == '#')
    map[i][j]
    = false;
    else
    map[i][j]
    = true;
    if (st[i][j] == 'S')
    {
    point[
    0].x = i;
    point[
    0].y = j;
    }
    if (st[i][j] == 'A')
    {
    point[tot].x
    = i;
    point[tot].y
    = j;
    tot
    ++;
    }
    }
    }

    bool ok(Point &a)
    {
    if (a.x < 0 || a.y < 0 || a.x >= n || a.y >= m)
    return false;
    return map[a.x][a.y] && (dist[a.x][a.y] == -1);
    }

    void bfs(Point &a)
    {
    memset(dist,
    -1, sizeof(dist));
    int front, rear;
    front
    = rear = 0;
    q[rear
    ++] = a;
    dist[a.x][a.y]
    = 0;
    Point temp;
    while (front != rear)
    {
    temp
    = q[front++];
    if (front == maxn * maxn)
    front
    = 0;
    Point b;
    for (int i = 0; i < 4; i++)
    {
    b.x
    = temp.x + dir[i][0];
    b.y
    = temp.y + dir[i][1];
    if (ok(b))
    {
    q[rear
    ++] = b;
    if (rear == maxn * maxn)
    rear
    = 0;
    dist[b.x][b.y]
    = dist[temp.x][temp.y] + 1;
    }
    }
    }
    }

    void make()
    {
    for (int i = 0; i < tot; i++)
    {
    bfs(point[i]);
    for (int j = 0; j < tot; j++)
    cost[i][j]
    = dist[point[j].x][point[j].y];
    }
    }

    int prim(int n)
    {
    int i, j, p;
    int minc, res = 0;
    memset(vis,
    0, sizeof(vis));
    vis[
    0] = 1;
    for (i = 1; i < n; i++)
    lowc[i]
    = cost[0][i];
    for (i = 1; i < n; i++)
    {
    minc
    = inf;
    p
    = -1;
    for (j = 0; j < n; j++)
    if (0 == vis[j] && minc > lowc[j])
    {
    minc
    = lowc[j];
    p
    = j;
    }
    if (inf == minc)
    return -1;
    res
    += minc;
    vis[p]
    = 1;
    for (j = 0; j < n; j++)
    if (0 == vis[j] && lowc[j] > cost[p][j])
    lowc[j]
    = cost[p][j];
    }
    return res;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    int t;
    scanf(
    "%d", &t);
    while (t--)
    {
    input();
    make();
    printf(
    "%d\n", prim(tot));
    }
    return 0;
    }

  • 相关阅读:
    MAVEN 配置阿里云源
    Windows10远程连接CentOS7(搭建Xrdp服务器)
    在jsp显示图片
    unbuntu自动任务定时重启
    eager模式与自定义训练
    JDK安装
    VMware克隆Linux虚拟机注意事项
    系统字符编码
    Iptables防火墙
    查看系统信息
  • 原文地址:https://www.cnblogs.com/rainydays/p/2090406.html
Copyright © 2011-2022 走看看