BZOJ 3732 Network 最小瓶颈路

BZOJ 3732 Network 最小瓶颈路

大家好,又见面了,我是全栈君。

题目大意:给出一个无向边,非常多询问,问x,y两地之间的最长路最短是多少。

思路:乍一看好像是二分啊。

的确这个题二分能够做。可是时间会慢非常多,有的题直接就T掉(NOIP2013货车运输)。

事实上这个题的模型就是最小瓶颈路模型。

解法就是把无向图变成一个最小生成树,然后两点之间的最长路就是满足题意的答案。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 15010
#define INF 0x7f7f7f7f
using namespace std;

struct Complex{
	int x,y,len;

	bool operator <(const Complex &a)const {
		return len < a.len;
	}
	void Read() {
		scanf("%d%d%d",&x,&y,&len);
	}
}edge[MAX << 2];

int points,edges,asks;
int head[MAX],total;
int next[MAX << 1],length[MAX << 1],aim[MAX << 1];

int fa[MAX];

int deep[MAX];
int father[MAX][20],min_length[MAX][20];

void Pretreatment();
int Find(int x);

inline void Add(int x,int y,int len);

void DFS(int x,int last);
void SparseTable();

int GetLCA(int x,int y);

int main()
{
	cin >> points >> edges >> asks;
	Pretreatment();
	for(int i = 1;i <= edges; ++i)
		edge[i].Read();
	sort(edge + 1,edge + edges + 1);
	for(int i = 1;i <= edges; ++i) {
		int fx = Find(edge[i].x);
		int fy = Find(edge[i].y);
		if(fx != fy) {
			Add(edge[i].x,edge[i].y,edge[i].len);
			Add(edge[i].y,edge[i].x,edge[i].len);
			fa[fx] = fy;
		}
	}
	DFS(1,0);
	SparseTable();
	for(int x,y,i = 1;i <= asks; ++i) {
		scanf("%d%d",&x,&y);
		printf("%d\n",GetLCA(x,y));
	}
	return 0;
}

void Pretreatment()
{
	for(int i = 1;i <= points; ++i)
		fa[i] = i;
}

int Find(int x)
{
	if(fa[x] == x)	return x;
	return fa[x] = Find(fa[x]);
}

inline void Add(int x,int y,int len)
{
	next[++total] = head[x];
	aim[total] = y;
	length[total] = len;
	head[x] = total; 
}

void DFS(int x,int last)
{
	deep[x] = deep[last] + 1;
	for(int i = head[x];i;i = next[i]) {
		if(aim[i] == last)	continue;
		father[aim[i]][0] = x;
		min_length[aim[i]][0] = length[i];
		DFS(aim[i],x);
	}
}

void SparseTable()
{
	for(int j = 1;j < 20; ++j)
		for(int i = 1;i <= points; ++i) {
			father[i][j] = father[father[i][j - 1]][j - 1];
			min_length[i][j] = max(min_length[i][j - 1],min_length[father[i][j - 1]][j - 1]);
		}
}

int GetLCA(int x,int y)
{
	int re = 0;
	if(deep[x] < deep[y])	swap(x,y);
	for(int i = 19;i >= 0; --i)
		if(deep[father[x][i]] >= deep[y]) {
			re = max(re,min_length[x][i]);
			x = father[x][i];
		}
	if(x == y)	return re;
	for(int i = 19;i >= 0; --i)
		if(father[x][i] != father[y][i]) {
			re = max(re,min_length[x][i]);
			re = max(re,min_length[y][i]);
			x = father[x][i];
			y = father[y][i];
		}
	re = max(re,min_length[x][0]);
	re = max(re,min_length[y][0]);
	return re;
}

转载于:https://www.cnblogs.com/yutingliuyl/p/6800033.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108523.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ASSERT_VALID宏[通俗易懂]

    ASSERT_VALID宏[通俗易懂]ASSERT_VALID()验证指针是否指向空值//AssurethatpMyObjectisavalidpointertoan//objectderivedfromCObject.ASSERT_VALID(pMyObject);SeeAlso   ASSERT,VERIFY

    2022年9月5日
    2
  • Java的反射机制原理[通俗易懂]

    Java的反射机制原理[通俗易懂]一、什么是反射:(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。二.反射机制的概念指在运行状态中..

    2022年7月8日
    32
  • 机器学习中【回归算法】详解

    机器学习中【回归算法】详解关注微信公众号【Microstrong】,我写过四年Android代码,了解前端、熟悉后台,现在研究方向是机器学习、深度学习!一起来学习,一起来进步,一起来交流吧!本文同步更新在我的微信公众号里,地址:https://mp.weixin.qq.com/s?__biz=MzI5NDMzMjY1MA==&amp;mid=2247483935&amp;idx=1&amp;sn=5e1c55c76…

    2022年8月21日
    3
  • 【机器学习笔记】有监督学习和无监督学习

    【机器学习笔记】有监督学习和无监督学习有监督学习和无监督学习(一)有监督学习(二)无监督学习(三)二者的区别(四)如何在两者中选择合适的方法(一)有监督学习概念:通过已有的训练样本去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现预测和分类的目的,也就具有了对未知数据进行预测和分类的能力。简单来说,就像有标准答案的练习题,然后再去考试,相比没有答案的练习题然后去考试准确率更高。监督学…

    2022年5月28日
    48
  • poe交换机跟普通交换机的区别_以太网交换机和poe交换机的区别

    poe交换机跟普通交换机的区别_以太网交换机和poe交换机的区别众所周知电气设备只有通电后才能工作,而一些基于IP网络的各种设备也同样需要供电才能使用,自从有了poe供电技术后IP网络设备就又多了一种供电方式。那么具体poe工业以太网交换机可以当普通工业以太网交换机用吗,poe工业以太网交换机有哪些优势呢?poe工业以太网交换机可以当普通工业以太网交换机用吗poe工业以太网交换机的可以当作普通工业以太网交换机来用的,不过必要是正规厂商生成的支持802.3at/af协议的poe工业以太网交换机,因为这些poe工业以太网交换机在供电前会先提供1个低电压检测前..

    2022年10月5日
    0
  • 我的第一次WebService接口开发

    我的第一次WebService接口开发前言最近项目上需要对接WebService接口,之前从来没有用过,这次都遇见了。记录下基础的使用和我遇见的问题。正文概述WebService接口百度一搜,各个介绍的都非常详细,由于刚开始没接触,看的也不是很懂。首先记住一句话:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。跨编程语言和跨操作系统平台:也就是说Asp.net开发的WebService我用java代码调用…

    2022年6月12日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号