POJ 2195 Going Home(KM)

本文详细介绍了POJ2195 Going Home问题的解决策略,通过构建二分图并应用KM算法求解最短路径问题。文章解释了如何利用图论知识解决实际问题,包括距离计算和路径优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:POJ 2195 Going Home

人是可以踩踏房子经过的,那距离就很好求了。建图求距离,把距离设为负的,就转化为KM了,最后别忘了负号。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAX_N = 100 + 30;
const int INF = 0x3f3f3f3f;

int n_x, n_y;//两边的点数
int G[MAX_N][MAX_N];//二分图权值
int link[MAX_N], l_x[MAX_N], l_y[MAX_N];//y中各店匹配的状态,  x,y,中的点标号
int slack[MAX_N];
bool vis_x[MAX_N], vis_y[MAX_N];

bool DFS(int x)
{
    vis_x[x] = true;
    for(int y = 0; y < n_y; y++)
    {
        if(vis_y[y])
            continue;
        int temp = l_x[x] + l_y[y] - G[x][y];
        if(temp == 0)
        {
            vis_y[y] = true;
            if(link[y] == -1 || DFS(link[y]))
            {
                link[y] = x;
                return true;
            }
        }
        else if(slack[y] > temp)
            slack[y] = temp;
    }
    return false;
}

int KM()
{
    memset(link, -1, sizeof(link));
    memset(l_y, 0, sizeof(l_y));
    for(int i = 0; i < n_x; i++)
    {
        l_x[i] = -INF;
        for(int j = 0; j < n_y; j++)
            if(G[i][j] > l_x[i])
                l_x[i] = G[i][j];
    }
    for(int x = 0; x < n_x; x++)
    {
        for(int i = 0; i < n_y; i++)
            slack[i] = INF;
        while(true)
        {
            memset(vis_x, false, sizeof(vis_x));
            memset(vis_y, false, sizeof(vis_y));
            if(DFS(x))
                break;
            int d = INF;
            for(int i = 0; i < n_y; i++)
                if(!vis_y[i] && d > slack[i])
                    d = slack[i];
            for(int i = 0; i < n_y; i++)
                if(vis_x[i])
                    l_x[i] -= d;
            for(int i = 0; i < n_y; i++)
            {
                if(vis_y[i])
                    l_y[i] += d;
                else
                    slack[i] -= d;
            }
        }
    }
    int res = 0;
    for(int i = 0; i < n_y; i++)
        if(link[i] != -1)
            res += G[link[i]][i];
    return res;

}
char _map[MAX_N][MAX_N];

struct Man
{
    int x, y;
};
struct House
{
    int x, y;
};
Man man[MAX_N];
House house[MAX_N];

int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF && n + m)
    {
        for(int i = 0; i < n; i++)
            scanf("%s", _map[i]);
        int cnt_man = 0, cnt_house = 0;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                if(_map[i][j] == 'm')
                {
                    man[cnt_man].x = i;
                    man[cnt_man++].y = j;
                }
                else if(_map[i][j] == 'H')
                {
                    house[cnt_house].x = i;
                    house[cnt_house++].y = j;
                }
            }
        }
        n_x = cnt_man;
        n_y = cnt_house;
        for(int i = 0; i < cnt_man; i++)
            for(int j = 0; j < cnt_house; j++)
                G[i][j] = -(abs(man[i].x - house[j].x) + abs(man[i].y - house[j].y));
        printf("%d\n", -KM());
    }
    return 0;
}


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值