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


相关推荐

  • ASP NET MVC Web开发教程

    ASP NET MVC Web开发教程ASPNETMVCWeb开发教程使用ASPNETMVC和C#快速学习Web开发。从绝对基础到忍者!像专业人士一样学习C#和MVC课程英文名:CompleteASPNETMVCWebDevelopment-NewbietoNinja!此视频教程共4.0小时,中英双语字幕,画质清晰无水印,源码附件全百度网盘地址:https://pan.baidu.com/s/1tarxUTa-F0KOPeXXmocLLg?pwd=7evf课程介绍:https://www.aihor

    2022年7月22日
    7
  • mysql取分组后最新的一条数据_mysql分组后取最大时间

    mysql取分组后最新的一条数据_mysql分组后取最大时间mysql取分组后最新的一条记录,下面两种方法.一种是先筛选出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了#select*fromt_assistant_articleasa,(selectmax(base_id)asbase_id,max(create_time)ascreate_timefromt_assista

    2025年6月22日
    5
  • intellij idea2021.5激活码【注册码】

    intellij idea2021.5激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    53
  • HTML页面模板_html模板

    HTML页面模板_html模板作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主。有不正确的地方,欢迎批评指正HTML页面模板代码常用的页面模板<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″>…

    2025年9月28日
    3
  • eclipse环境下spring整合mybatis详细教程[通俗易懂]

    eclipse环境下spring整合mybatis详细教程[通俗易懂]系列目录第一篇:3分钟快速了解Mybatis的基础配置第二篇:带你3分钟了解Mybatis映射文件(sql,resultMap等映射)第三篇:三分钟带你了解mybatis关联映射(案例分析一对一,多对多)原创不易,如若喜欢,就点一点赞,关注一下吧!文章目录系列目录一、整合环境搭建-jar包准备1.spring所需要使用的jar包有(8+2):2.mybatis所需要使用的jar包有3.spring整合mybatis的中间jar二、整合环境搭建-创建项目1.eclipse环境创建2.jar添

    2022年5月2日
    55
  • 桌面cpu性能排行榜_19年cpu天梯图

    桌面cpu性能排行榜_19年cpu天梯图排名 处理器 图例 分数 1 IntelXeonPlatinum8173M@2.00GHz 28860 2 IntelXeonGold6154@3.00GHz 27789 3 IntelCorei9-7980XE@2.60GHz 27736 4 IntelXeonW-…

    2026年2月2日
    4

发表回复

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

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