【wikioi 1002】搭桥 dfs+kruskal

[Codeforces 125E] MST Company (单度限制最小生成树) 题意: 有N个点,M条边,要生成一颗树。使得边权最小,而且对于起点 1 有度限制(k)。如果可以,输出所选边,否则输出 -1. 这道题可以用度限制最小生成树来做,但是这道题和度限制最小生成树又有区别,这里要求根节点的度必须为K。而后者要求小于等于K的最小值。 所以这道题目可以采用二分来实现。 采用krusical来做最小生成树的时候,每次挑选最小可行边加入集合,所以可以预处理一下与 阅读详情
题目描述 Description

有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物。现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建,如下图城市1有5栋建筑物,可以搭建4座桥将建筑物联系起来。城市2有两座建筑物,但不能搭建桥梁将它们连接。城市3只有一座建筑物,城市4有3座建筑物,可以搭建一座桥梁联系两栋建筑物,但不能与第三座建筑物联系在一起。

输入描述 Input Description

在输入的数据中的第一行包含描述城市的两个整数r 和c, 分别代表从北到南、从东到西的城市大小(1 <= r <= 50 and 1 <=  c <= 50). 接下来的r 行, 每一行由c 个(“#”)和(“.”)组成的字符. 每一个字符表示一个单元格。“#”表示建筑物,“.”表示空地。

 

输出描述 Output Description

在输出的数据中有两行,第一行表示建筑物的数目。第二行输出桥的数目和所有桥的总长度。

样例输入 Sample Input

样例1

3 5

#...#

..#..

#...#

 

样例2

3 5

##...

.....

....#

 

样例3

3 5

#.###

#.#.#

###.#

 

样例4:

3 5

#.#..

.....

....#

 

样例输出 Sample Output

样例1

5

4 4

 

样例2

2

0 0

 

样例3

1

0 0

 

样例4

3

1 1

数据范围及提示 Data Size & Hint

见描述



思路:这道题目有两问,第一问是问建筑物分成几块(要注意的是八个方向都可以)。

第二问一开始没读懂题意。后来才发现问的是,如果不为同一个建筑物的话,两两之间要连桥(桥只能横着或者竖着,不能拐),问最多连的桥数和最少的桥长度。用kruskal的思想即可。


/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF (1 << 30)
#define LINF (1LL << 60)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i < n; i++)
#define per(i, a, n) for (int i = n - 1; i >= a; i--)
#define eps 1e-6
#define debug puts("===============")
#define pb push_back
#define mkp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define POSIN(x,y) (0 <= (x) && (x) < n && 0 <= (y) && (y) < m)
typedef long long ll;
typedef unsigned long long ULL;
int m, n;
char mp[60][60];
int vis[60][60];
int pos[2000][2], cnt;
int dx[8] = { -1, -1, -1, 0, 1, 1, 1, 0};
int dy[8] = { -1, 0, 1, 1, 1, 0, -1, -1};
int ans;
void dfs(int x, int y) {
    for (int i = 0; i < 8; i++) {
        int tx = x + dx[i], ty = y + dy[i];
        if (POSIN(tx, ty) && mp[tx][ty] == '#' && !vis[tx][ty]) {
            vis[tx][ty] = ans;
            dfs(tx, ty);
        }
    }
}
struct node {
    int x, y, l;
}e[200000];
int tot, f[20000];
int find(int x) {
    return f[x] = (f[x] == x ? x : find(f[x]));
}
void add(int i, int j) {
    int x = pos[i][0], y = pos[i][1];
    int tx = pos[j][0], ty = pos[j][1];
    if (vis[x][y] == vis[tx][ty]) return ;
    if (abs(x - tx) <= 1 && abs(y - ty) <= 1) return ;
    if (abs(x - tx) > 1 && abs(y - ty) > 1) return ;
    e[tot].x = vis[x][y], e[tot].y = vis[tx][ty], e[tot++].l = max(abs(x - tx), abs(y - ty)) - 1;
}
bool cmp(node s, node v) {
    return s.l < v.l;
}
void work() {
    int ans = 0, sum = 0;
    sort(e, e + tot, cmp);
    for (int i = 0; i < tot; i++) {
        int x = find(e[i].x), y = find(e[i].y);
        if (x != y) {
            f[x] = y;
            ans++, sum += e[i].l;
        }
    }
    cout<<ans<<" "<<sum<<endl;
}
int main () {
    cin >> n >> m;
    cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> mp[i][j];
            if (mp[i][j] == '#') {
                pos[cnt][0] = i;
                pos[cnt++][1] = j;
            }
        }
    }
    ans = 0;
    for (int x = 0; x < cnt; x++) {
        int i = pos[x][0], j = pos[x][1];
        if (!vis[i][j]) {
            ans++;
            vis[i][j] = ans;
            dfs(i, j);
        }
    }
    cout<<ans<<endl;
    tot = 0;
    for (int i = 0; i < cnt; i++) {
        f[i] = i;
        for (int j = i + 1; j < cnt; j++) {
            add(i, j);
        }
    }
    work();
    return 0;
}


图论基础:从七桥问题到现代网络结构的数学语言 图论以点与边的抽象模型揭示现实世界中复杂关系的本质。从欧拉解决七桥问题出发,发展出度数、连通性、同构等核心概念,并通过邻接矩阵实现计算机化处理。其应用涵盖社交网络距离计算、死锁检测、资源分配优化及最小覆盖选址等。关键定理如握手定理、矩阵幂表示路径数,以及独立集与覆盖集的互补关系,构建了从理论到实践的完整体系。掌握图论,即掌握了理解与优化现代信息系统的底层逻辑。 阅读详情

相关推荐

保姆级教程:用Unidbg搞定阿里系App的x-sign和长x-mini-wua签名(附完整Java代码)

本文详细介绍了如何使用Unidbg框架模拟执行阿里系App的原生库,生成关键的x-sign和x-mini-wua签名参数。通过完整的Java代码示例和实战技巧,帮助开发者高效实现签名算法,适用于安全研究、数据分析和第三方应用开发场景。

weixin_29243279的博客 487

codevs 1002 搭桥 dfs+kruskal

呜呜呜

Loi_cgold 303

MNE-python 进行源定位教程(一)配置环境

根据MNE官网提供的教程进行复现,遇到各种问题的记录。 配置环境 python3.8 + Anaconda + pycharm MNE-Python 是一个开源 Python 模块,用于处理、分析和可视化功能性神经影像数据(EEG、MEG、sEEG、ECoG 和 fNIRS)。 根据官方建议,将MNE-python安装在anaconda的虚拟环境中。 1. 安装Anaconda 过程点击这里 2. 配置pycharm 2.1 导入MNE-python工具包 在pycharm的菜单栏里打开VCS-Create

zQIANYUN的博客 3173

【wikioi】1002 搭桥(dfs+最小生成树)

http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T。照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T。 好吧,题解。 首先对于第一个问,我们直接深搜就行了,沿着相连的城市走(ps,这里很坑啊啊啊,左上角和右上角还有左下角右下角也算联通啊!!!一开始我没发现!!) 那么我们就可以将这些城市看做缩点...

129

第十二节:C#工业控制编程基础--输出正弦波实验

第十二节:基于c#使用开发板输出正弦波实验 文章目录第十二节:基于c#使用开发板输出正弦波实验一、实验目的:了解采集卡DA相关函数的使用。二、实验内容:利用C#生成正弦波,然后用采集卡DA输出。三、实验步骤:1.打开Visual Studio 2013,新建窗体应用程序项目,配置好板卡dll文件。2.在窗体中放入控件,对控件进行布局排版,并修改他们的Name属性和Text属性。3.在Chart控件内选择Spline型图表,如图2。4.进入编程区域,在public partial class Form1 :

weixin_49237052的博客 2296

小白快速上手 labelme:新手图像标注详解教程

本教程旨在帮助初次接触 labelme 的用户快速上手该软件,掌握基本操作与标注流程,为语义分割数据集做准备。

小白一枚~ 2万+

sgu 176 Flow construction (有汇源有上下界的最小流)

sgu 176  Flow construction  链接:http://acm.sgu.ru/problem.php?contest=0&problem=176 题意:有一个加工厂,里面有n台机器,起点为1终点为n。中间的生产环节有货物限制,输入m个环节。每个环节有u,v,z,c四个数字。u表示起始机器,v表示终止机器,如果c为1,那么这条边的流量必须为z。如果c为0,那么流量在[

SIOFive的专栏 1987

YOLOv11改进 | 主干/Backbone篇 | 利用RT-DETR主干网络PPHGNetV2助力yolov11有效涨点(轻量化目标检测网络)

本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv11的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们今天来讲解的网络结构模型,这个网络结构目前还没有推出论文,所以其理论知识在网络上也是非常的少,我也是根据网络结构图进行了分析(精度mAP提高0.05)。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备​目录一、本文介绍。

Snu77的博客 3721

[POJ 3164] Command Network 有向图的最小树形图(朱刘算法)

Command Network

SIOFive的专栏 1845

ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)

every blog every motto: You never know how strong you really are until being strong is the only choice you have。 0. 前言 本系列教程旨在系统学习并梳理ENVI。说来惭愧,作为一名GISer,对ENVI这类软件还不能熟练掌握,这也是本系列教程的初衷。种一棵树最好的时间是十年以前,其次是...

胡侃有料的博客 1万+

面经-2023-禾赛-FPGA工程师

面经-2023-禾赛-FPGA工程师

w0shishabi的博客 2969

[POJ 1724] ROADS (有约束条件的最短路)

题目链接:

SIOFive的专栏 1707

汇川Easy系列斜坡函数功能块(支持状态输出)

IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。

RXXW_Dor的博客 460

[POJ 2728] 最优比例生成树

POJ 2728 最优比例生成树

SIOFive的专栏 1616

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

POJ 2396 Budget (有源汇有上下界的可行流)

POJ 2396 Budget  链接:http://poj.org/problem?id=2396 题意:给定一个M*N的矩阵,给定每行每列的和,以及其中一些值的限定条件,问能否构成一个可行的矩阵。 思路: 添加一个源点,向每行连边,每条边的上下界都为该行的和;添加一个汇点,每列向汇点连边,边的上下界都为该列的和。然后每行向每列连边,边的上下界一开始为(0,INF),之后

SIOFive的专栏 1613

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

sgu 194 Reactor Cooling 无源汇有上下界最大流

sgu 194 Reactor Cooling 链接:http://acm.sgu.ru/problem.php?contest=0&problem=194

SIOFive的专栏 1575

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[UVALive 6663 Count the Regions] (dfs + 离散化)

链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675 题目大意: 在一个平面上有 n (1 解题思路: 由于n很小,可以对整个图进行压缩,只要不改变每条边的相对位置,对答案没有影响。 可以将这些矩形的坐标离

SIOFive的专栏 1495

POJ 3436 ACM Computer Factory (最大流 + 输出路径)

POJ 3436 ACM Computer Factory 链接:http://poj.org/problem?id=3436 题意:每台电脑有P部分,可以通过不同的机器来进行加工。有N台机器,每台机器用2 P +1 个整数来描述:Qi  Si,1  Si,2 ...  Si,p  Di,1  Di,2. ..  Di,p,其中Qi 指定了机器的性能,表示每小时加工的电脑数量。Si,j

SIOFive的专栏 1485

UVALive 6665 Dragonas Cruller

题目链接:https://icpcarchive.ecs.baylor.edu/external/66/6665.pdf 题目大意: 有一个3 * 3 的格子: 每一个格子上面的数字可以朝上下左右四个方向移动,如果移出范围,则到与其边界上字母对应的另一边。如下图所示: 空白部分分别向上下左右移动之后的情况。 现在,给你左右移动的费用ch,上下移动cv。给你一个初始状态(9个数

SIOFive的专栏 1475

[POJ 2585] Window Pains (拓扑排序)

Window Pains 题目链接:http://poj.org/problem?id=2585 题目大意: 有4*4的网格,其中有九个任务,在网格上的位置如下。 现在依次打开几个任务,在同一个网格上,前一个任务会覆盖掉后一个任务。给你一个网格,问你能否通过调整先后顺序,使得构成该网格。 1 1 . . 1 1 . . .

SIOFive的专栏 1458

HDU 4862 Jump (最小K路径覆盖)

HDU 4862 Jump 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4862 题意:给定一个N*M的矩阵,矩阵里面为0~9的数字。现在规定从一个点可以跳到它正下方和正右方的点,花费的费用为曼哈顿距离 - 1。如果在跳的过程中,两个点的数字相同,那么将得到该点的数字。规定可以从任意点开始跳,每个点只能经过1次。最多可以选择K个点来作为起点

SIOFive的专栏 1389

POJ 1966 Cable TV Network(无向图的顶点连通度)

POJ 1966 Cable TV Network 链接:http://poj.org/problem?id=1966 题意:有线电视网络中,中继器的连接是双向的。如果网络中任何两个中继器之间至少有一条路,则中继器网络称为是连通的,否则中继器网络是不连通的。一个空的网络、以及只有一个中继器的网络被认为是连通的。具有n 个中继器的网络的安全系数f 被定义成: (1) f 为n,如果不管

SIOFive的专栏 1362

[POJ 1639] 单度限制最小生成树

POJ 1639 Picnic Planning 单度限制最小生成树

SIOFive的专栏 1324

[POJ 1128] Frame Stacking (拓扑排序)

拓扑排序的所有序列 POJ1128 Frame Stacking

SIOFive的专栏 1301

图论--最短路径(Dijkstra, Bellman-Ford)

最短路径

x13262608581的博客 257

图论--存储,转置,拓扑排序

邻接表,矩阵,转置,拓扑排序

x13262608581的博客 213
上一篇: HDU 4862 Jump (最小K路径覆盖)
SIO__Five
博客等级 码龄14年 29粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值