热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bzoj48834886图论新高度!!!!!

bzoj4883最小生成环套树森林Description在一个n*m的棋盘上要放置若干个守卫。对于n行来说,每行必须恰好放置一个横向守卫;同理对于m列

bzoj4883最小生成环套树森林


Description


在一个n*m的棋盘上要放置若干个守卫。对于n行来说,每行必须恰好放置一个横向守卫;同理对于m列来说,每列
必须恰好放置一个纵向守卫。每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个守卫,一个守卫
不能同时兼顾行列的防御。请计算控制整个棋盘的最小代价。


Input


第一行包含两个正整数n,m(2<&#61;n,m<&#61;100000,n*m<&#61;100000)&#xff0c;分别表示棋盘的行数与列数。
接下来n行&#xff0c;每行m个正整数
其中第i行第j列的数w[i][j](1<&#61;w[i][j]<&#61;10^9)表示在第i行第j列放置守卫的代价。


Output


输出一行一个整数&#xff0c;即占领棋盘的最小代价。


Sample Input


3 4
1 3 10 8
2 1 9 2
6 7 4 6


Sample Output


19

HINT
在(1,1),(2,2),(3,1)放置横向守卫&#xff0c;在(2,1),(1,2),(3,3),(2,4)放置纵向守卫。

题解&#xff1a;假如把a[i][j]看作i->j的边&#xff0c;那么得到的显然会是一个环套树森林。
那么就跑最小生成树&#xff0c;然后记录每个点所在连通块是树还是图即可。
假如要合并i,j
如果ij都是图了&#xff0c;那么就没办法咯。
不然&#xff0c;i,j在同一个集合时加入这条边即可 树->图 &#xff1b; 不在同一个集合的话&#xff0c;就把他们并起来&#xff0c;然后判断得到的是一个什么图形。
如果原来是树&#43;树&#xff0c;得到树&#xff0c;树&#43;图得到图。
最终就相当于在n&#43;m个点组成的图中&#xff0c;找n&#43;m条边&#xff0c;组成一个最小环。
复杂度nmlog(nm)

#include
using namespace std;
typedef long long ll;
int pre[100010],c,n,m,vis[100010];
void init(){for(int i&#61;1;i<&#61;n&#43;m;i&#43;&#43;)pre[i]&#61;i;}
int findd(int x)
{if(x&#61;&#61;pre[x])return x;return pre[x]&#61;findd(pre[x]);
}
struct node{int a,b,c,next;}edge[200010];int cnt&#61;0;
void add(int a,int b,int c){edge[cnt].a&#61;a;edge[cnt].b&#61;b;edge[cnt&#43;&#43;].c&#61;c;}
bool cmp(node p1,node p2){return p1.cint main()
{scanf("%d%d",&n,&m);init();for(int i&#61;1;i<&#61;n;i&#43;&#43;)for(int j&#61;1;j<&#61;m;j&#43;&#43;){scanf("%d",&c);add(i,j&#43;n,c);}sort(edge,edge&#43;cnt,cmp);ll ans&#61;0,sum&#61;0;;for(int i&#61;0;i}

bzoj4886
 

我们对于a&#xff0c;b离散后建点&#xff0c;那么一个卡片就相当于a到b有一条边。

现在要给边定向&#xff0c;使得每个点入度均为1。&#xff08;并查集的操作&#xff09;

贡献&#61;每个点出度*该点权值

bzoj4883的时候谈过&#xff0c;这样的连通块要么是环套树要么是树。

肯定都有的一部分贡献是(deg[i]-1)*a[i]&#xff08;总度数-入度&#xff09;*权值

对于树&#xff0c;存在一个节点没有入度&#xff0c;所以我们并查集的时候找到连通块中权值最大的即可。

对于环套树&#xff0c;每个点都必须有入度&#xff0c;那么就直接统计。


#include
using namespace std;
typedef long long ll;
typedef pairP;
const int mod&#61;1e9&#43;7;
const int INF&#61;0x3f3f3f3f;
const ll INFF&#61;0x3f3f3f3f3f3f3f3f;
const double pi&#61;acos(-1.0);
const double eps&#61;1e-9;
ll a[250010],b[250010],node[500010],pre[500010],maxx[500010],num[500010],vis[500010];
int findd(int x)
{if(x&#61;&#61;pre[x])return x;return pre[x]&#61;findd(pre[x]);
}
int main()
{int n;scanf("%d",&n);int cnt&#61;1;for(int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%lld%lld",&a[i],&b[i]);node[cnt&#43;&#43;]&#61;a[i],node[cnt&#43;&#43;]&#61;b[i];}sort(node&#43;1,node&#43;cnt);int cntt&#61;2;for(int i&#61;2;i}





推荐阅读
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 蓝桥杯算法实战:节点选取策略优化分析
    本文针对蓝桥杯算法竞赛中的节点选取策略进行了深入分析与优化。通过对比不同节点选择方法的效果,提出了基于贪心算法和动态规划的综合优化方案,旨在提高算法效率和准确性。实验结果表明,该优化策略在处理大规模数据集时表现出色,显著提升了算法性能。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 题目链接: Caninepoetry问题概述:给定一个仅包含小写字母的字符串,允许将任意位置的字符修改为任意其他小写字母。目标是通过最少次数的修改,使字符串中所有长度大于1的子串均满足特定条件。本文详细分析了该问题,并运用思维与贪心算法,提出了一种高效解决方案。通过对字符串的深入解析,我们探讨了如何在最小化修改次数的同时,确保所有子串符合要求。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 蓝桥杯物联网基础教程:通过GPIO输入控制LED5的点亮与熄灭
    本教程详细介绍了如何利用STM32的GPIO接口通过输入信号控制LED5的点亮与熄灭。内容涵盖GPIO的基本配置、按键检测及LED驱动方法,适合具有STM32基础的读者学习和实践。 ... [详细]
author-avatar
一粒小小无名砂_741
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有