首页 > 其他分享 >图论 最小生成树

图论 最小生成树

时间:2024-07-25 19:54:34浏览次数:14  
标签:图论 int 军队 最小 生成 vis dx dy id

未完善

lxy的通风报信

题目链接:https://ac.nowcoder.com/acm/contest/87255/G

题意:

在n * m网格种需要将军队合并并且求出最少多少天可以将军队合并
如果军队被挡则输出No

分析:

在一支军队移动时,其他军队不可移动。
由于只有一个军队在某一天可以移动,所以每次合并都必须依赖于一个'连接'操作,
即通过找到最短路径将两个不同军队连接起来 从这里可以看出需要使用最小生成树将
a个军队连接起来

  

我们需要计算从一个军队到所有其他军队的位置的最短路径长度 军队的移动是无权重的(即每步移动的代价相同),
BFS是一种适合的算法来计算这些最短路径。

  

最后得出思路:

如果要想将军队合并,就需要知道每个军队之间的距离,我们可以跑bfs来实现,
当知道每个点之间的距离之后我们跑一下最小生成树就可以知道最少多少天可以将军队合并了,
如果军队与军队之间被阻挡无法到达,则输出No。

Code:

#include <bits/stdc++.h>

using namespace std;
const int N = 1e3 + 5; 
int dirs[5] = {-1, 0, 1, 0, -1}; // 为了节省空间
int n, m, x[N], y[N], dp[N][N], vis[N][N], it;
char a[N][N];   

bool check(int x, int y) { 
    return x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == -1 && a[x][y] != '#';
} 

void bfs(int id) { // bfs的是id 到其他军队的值
    queue<pair<int, int>> q;
    memset(vis, -1, sizeof(vis)); 
    q.push({x[id], y[id]});
    vis[x[id]][y[id]] = 0;   
    while (!q.empty()) {
        auto [x, y] = q.front();  
        q.pop(); 
        for (int i = 0; i < 4; i++) {  
            int dx = dirs[i] + x;
            int dy = dirs[i + 1] + y; 
            if (check(dx, dy)) { // 如果 (dx, dy)有效 
                q.push({dx, dy});
                vis[dx][dy] = vis[x][y] + 1; // 更新距离
            }
        }
    }  
    for (int i = 1; i <= it; i++) { // 计算每个军队到其他所有军队的距离
        if (vis[x[i]][y[i]] == -1) {
            cout << "No\n"; // 如果某个军队不可达,输出 "No"
            exit(0); // 直接结束程序
        }
        dp[id][i] = vis[x[i]][y[i]]; // 记录距离
    }
}

int f[N], ans;
vector<array<int, 3>> adj;   
int find(int x) {
    return f[x] == x ? x : f[x] = find(f[x]);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cout << fixed << setprecision(15);  
    cin >> n >> m;  
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];  
            if (a[i][j] == '*') {  
                x[++it] = i;
                y[it] = j;  
            }
        }
    }  
    for (int i = 1; i <= it; i++) { // 对每个军队执行 BFS 计算最短路径
        bfs(i);
    }  
    for (int i = 1; i <= it; i++) f[i] = i;  
    for (int i = 1; i <= it; i++) {
        for (int j = 1; j <= it; j++) {
            if (i != j) {  
                adj.push_back({dp[i][j], i, j});
            }
        }
    } 
    sort(adj.begin(), adj.end());   
    for (auto [w, x, y] : adj) { // 跑最小生成树 获得最少天数
        x = find(x), y = find(y);
        if (x != y) {
            ans += w;  
            f[y] = x;  
        }
    } 
    cout << ans;  
    return 0;
}

  

标签:图论,int,军队,最小,生成,vis,dx,dy,id
From: https://www.cnblogs.com/youhualiuh/p/18324005

相关文章

  • STM32F407最小系统板烧录基于ST-LINK /V2
    STM32F407最小系统板烧录ST-LINK/V2背景我们使用的单片机最小系统板为STM32F407ZGT6,下载器为正点原子.方法下载测试程序下载好程序`LoadTest`,地址为Casdos/STM32F407NUEDC:电赛,尤其针对stm32f407zet6最小开发版相关代码(github.com)按图连接SWD和其它线路,注意SW......
  • 使用SpringAI框架实现文字生成图片壁纸:深入探索与实战
    使用SpringAI框架实现文字生成图片壁纸:深入探索与实战在当今的技术世界中,人工智能(AI)已经成为了一个热门话题。无论是自然语言处理、图像识别还是生成对抗网络(GAN),AI的应用场景无处不在。今天,我们将深入探讨如何使用SpringAI框架来实现一个有趣的功能:根据文字生成图片壁纸。什么是......
  • 求最小整数——全排列实现
    题目描述如图,将1~10这10个自然数以任意顺序排成一行,填入第一行的10个圆圈中,第二行最中间的圆圈填0,出了这1个圆圈之外,其余每一个圆圈所填的数字都等于它上方与之相连的圆圈中两个数的和,那么第十行的数N最小值是多少?输入无输出一个正整数解题思路将这个图看成是一个10行......
  • jwc令牌报错生成失败
    源代码//生成jwt令牌@TestpublicvoidtestGenJwt(){Map<String,Object>claims=newHashMap<>();//存储测试数据claims.put("id",1);claims.put("name","ZTZGTEDXT");String......
  • CMake 生成 Visual Studio 项目管理工程文件 sln
    前言全局说明CMake生成VisualStudio项目管理工程文件sln一、说明环境:Windows7旗舰版二、生成sln项目工程文件2.1UI界面版生成方式https://blog.csdn.net/analogous_love/article/details/1349075402.2命令行生成方式2.2.1看看都支持生成哪些版本2.2.......
  • C#.NET工行开放平台RSA私钥公钥生成小工具V2024
    C#.NET工行开放平台RSA私钥公钥生成小工具V2024 开发环境:.NETFRAMEWORK4.0rsatool.exe,来自于工行开发文档。 主要代码:stringthisAppPath=Application.StartupPath;stringexePath=Path.Combine(thisAppPath,"tools");stringexeFullName=Path.Combine(exePa......
  • 从 DOCKER 下的共享卷在 Linux 中执行 PyInstaller 生成的文件时出现 Python 子进程 F
    我已经使用PyInstaller生成了一个可执行文件,例如test(没有扩展名,因为它是Linux)并将其存储在一个目录中,例如data我有一个Python程序,如下所示:importsubprocessfrompathlibimportPath...defrun_exe():try:#getcurrentdirectory......
  • Django 根据指定的数据库表生成相应的 Django 模型和注意事项
    要根据指定的数据库表生成模型,并且将这些模型放入指定的Django应用中,你可以按照以下步骤进行操作:配置数据库连接:确保你的settings.py文件中的数据库配置正确,以便Django能够连接到你的数据库。DATABASES={'default':{'ENGINE':'django.db.backends......
  • 2844. 生成特殊数字的最少操作 Medium
    给你一个下标从 0 开始的字符串 num ,表示一个非负整数。在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。返回最少需要多少次操作可以使 num 变成特殊数字。如果整数 x 能被 25 整除,则该整数 x ......
  • 图像生成中图像质量评估指标—SSIM(结构相似性指数)介绍
    文章目录1.背景介绍2.实际应用3.总结和讨论1.背景介绍结构相似性指数(StructuralSimilarityIndex,简称SSIM)是一种用于评估两幅图像视觉相似度的指标。它不仅考虑了图像的亮度和对比度,还考虑了图像的结构信息。SSIM是图像质量评价中的一个重要指标,尤其在需要模拟......