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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js如何生成二维码_jquery 生成二维码无法识别

    js如何生成二维码_jquery 生成二维码无法识别前言最近根据自己的需求寻找到了一款简单易用的生成二维码插件,特此分享一、使用步骤1.下载插件npmiqrcodejs2或yarnaddqrcodejs2二、vue中使用1.vue2<template><div><divref=”qrcodeDom”></div><button@click=”show”>展示二维码</button><bu.

    2022年10月17日
    2
  • HDU 4825 Xor Sum 字典树+位运算

    HDU 4825 Xor Sum 字典树+位运算

    2021年12月5日
    53
  • python中pygame怎么安_Python中pygame安装方法图文详解

    python中pygame怎么安_Python中pygame安装方法图文详解本文实例讲述了Python中pygame安装方法。分享给大家供大家参考,具体如下:这里主要描述一下我们怎样来安装pygame可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用,或者怎样安装,在百度/google上面搜索了一番后,发现没有一篇详细描述pygame的安装过程的文章。如果你是其中的一员,那么这篇教程可能会帮助到你。当然,在学习pygame的时候,需要你要有一定的py…

    2022年5月12日
    47
  • java请求webservice_java service

    java请求webservice_java service展开全部java返回list这你应该会吧,然后转换成json格式给其它语言.json(javascriptObjectNotation的缩写)是一个基于文本的,人类可读32313133353236313431303231363533e4b893e5b19e31333361313936的,开放标准的轻量级数据交换格式。它继承了javascript中的简单数据结构和相关数组对象,称为对象。不管…

    2022年10月16日
    3
  • nick nack_coughing翻译

    nick nack_coughing翻译webrtc中fec的处理机制:获取一帧数据,拆分成多个rtp包,再封装成fec包(fec只有primayblock),发送到网络;之后根据rtp包生成相应数量的fec包(根据冗余度来生成对应数量的包),再发送到网络。需要注意的是:rtpred包和fecred包都是序号连续的。所以判断一个完整帧的依据依然可以使用:获取到首包,获取到尾包,中间包连续。但因为fec的加入,导致所有原始数据的rtp包无法连续(和纯nack不会这样)。所以针对带有fec包的丢包处理机制是这样的:如果一个完整帧里面丢了原始

    2022年8月11日
    5
  • PHP调用Webservice实例[通俗易懂]

    PHP调用Webservice实例[通俗易懂]NuSoap是PHP环境下的WebService编程工具,用于创建或调用WebService。它是一个开源软件,是完全采用PHP语言编写的、通过HTTP收发SOAP消息的一系列PHP类,由NuSphereCorporation(http://dietrich.ganx4.com/nusoap/)开发。NuSOAP的一个优势是不需要扩展库的支持,这种特性使得NuSoap可以用于所有的PHP环境,

    2022年7月21日
    16

发表回复

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

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