uva 11354 Bond
题意:
邦德在逃命!他在一个有N个城市,由M条边连接的道路网中。一条路的危险度被定义为这条路上危险度最大的边的危险度。
现在给出若干个询问,s,t,问从s到t的最小的危险度是多少。
思路:
首先可以证明这条路是固定的,就是最小生成树,证明略。
之后就是计算生成树上两点间的最长边,用prim算法预处理的话,由于N的规模较大,所以会超时。
由于MST是一棵树,想到树上两点之间的距离有O(log(n))的求法,即倍增求lca,按照同样的处理方法,只不过维护最大值,就可以在O(log(n))的时间内求出两点之间的最长边,查询为Q,总复杂度Qlog(n)。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std; const int maxn = ;
//const int inf = 0x3f3f3f3f; struct edge
{
int fr,to,len; edge(int a,int b,int c)
{
fr = a;
to = b;
len = c;
}
}; bool cmp(edge x,edge y)
{
return x.len < y.len;
} vector<edge> g[maxn],es;
int p[maxn][];
int fa[maxn];
int par[maxn];
bool vis[maxn];
int md[maxn][];
int deep[maxn]; int fin(int x)
{
if (x == par[x]) return x;
else return par[x] = fin(par[x]);
} void unit(int x,int y)
{
x = fin(x);
y = fin(y); if (x == y) return; par[x] = y;
} void dfs(int u)
{
vis[u] = ; for (int i = ;i < g[u].size();i++)
{
edge e = g[u][i]; int to = e.to; if (vis[to]) continue; fa[to] = u; deep[to] = deep[u] + ; md[to][] = e.len; dfs(to);
}
} void pre_deal(int n)
{
for (int i = ;i <= n;i++)
{
p[i][] = fa[i];
} //int sz = (int)(log(n*1.0) / log(2.0)) + 1; for (int j = ;j<= ;j++)
{
for (int i = ;i <= n;i++)
{
p[i][j] = p[p[i][j-]][j-];
md[i][j] = max(md[i][j-],md[p[i][j-]][j-]);
}
}
} int query(int a,int b,int n)
{
if (deep[a] < deep[b]) swap(a,b); int c = deep[a] - deep[b]; int ans = ; //int sz = (int)(log(n * 1.0) / log(2.0)) + 1; for (int i = ;i <= ;i++)
{
if (c & ( << i))
{
ans = max(ans,md[a][i]);
a = p[a][i];
//printf("%d **\n",ans);
}
} if (a == b) return ans;
else
{
for (int i = ;i >= ;i--)
{
if (p[a][i] != p[b][i])
{
ans = max(ans,md[a][i]);
ans = max(ans,md[b][i]); a = p[a][i];
b = p[b][i];
}
}
} ans = max(ans,md[a][]);
ans = max(ans,md[b][]); return ans;
} void init(int n)
{
for (int i = ;i <= n;i++)
{
g[i].clear();
par[i] = i;
} es.clear(); memset(vis,,sizeof(vis));
memset(md,,sizeof(md));
memset(deep,,sizeof(deep));
memset(md,,sizeof(md));
} int main()
{
int n,m; int kase = ; while (scanf("%d%d",&n,&m) != EOF)
{
if (kase++) printf("\n"); init(n); for (int i = ;i < m;i++)
{
int a,b,c; scanf("%d%d%d",&a,&b,&c); es.push_back(edge(a,b,c));
} sort(es.begin(),es.end(),cmp); for (int i = ;i < m;i++)
{
int x = es[i].fr,y = es[i].to; if (fin(x) == fin(y)) continue; unit(x,y); g[x].push_back(edge(x,y,es[i].len));
g[y].push_back(edge(y,x,es[i].len));
} deep[] = ;
//
dfs();
//printf("233\n");
pre_deal(n); int q; scanf("%d",&q); for (int i = ;i < q;i++)
{
int a,b; int ans = ; scanf("%d%d",&a,&b); ans = query(a,b,n); printf("%d\n",ans);
}
} return ;
}
uva 11354 Bond的更多相关文章
- uva 11354 - Bond(树链拆分)
题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...
- UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)
题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...
- UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...
- UVA 11354 Bond(MST + LCA)
n<=50000, m<=100000的无向图,对于Q<=50000个询问,每次求q->p的瓶颈路. 其实求瓶颈路数组maxcost[u][v]有用邻接矩阵prim的方法.但是 ...
- UVA 11354 - Bond (最小生成树 + 树链剖分)
题目链接~~> 做题感悟:这题開始看到时感觉不是树不优点理,一想能够用 Kruskal 处理成树 ,然后就好攻克了. 解题思路: 先用 Kruskal 处理出最小生成树.然后用树链剖分 + 线段 ...
- UVA 11354 Bond 最小生成树 + lca
题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...
- UVA - 11354 Bond(最小生成树+LCA+瓶颈路)
题意:N个点,M条路,每条路的危险度为路上各段中最大的危险度.多组询问,点s到点t的所有路径中最小的危险度. 分析: 1.首先建个最小生成树,则s到t的路径一定是危险度最小的. 原因:建最小生成树的最 ...
- 训练指南 UVA - 11354(最小生成树 + 倍增LCA)
layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...
- Bond UVA - 11354(LCA应用题)
Once again, James Bond is on his way to saving the world. Bond's latest mission requires him to trav ...
随机推荐
- sharepoint webapp 部署注意点
只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta ...
- c#中base64编码解码
//编码: byte[] bytes = Encoding.Default.GetBytes("要转换的字符"); string str = Convert.ToBase64Str ...
- 结合python+selenium使用AutoIt V3实现文件、图片上传
1.下载.安装AutoIt V3 下载官网:https://www.autoitscript.com/site/autoit/downloads/ 2.AutoIt V3组件介绍 AutoIt Win ...
- localStorage 不方便存储数组时的替代方法
项目背景是需要将搜索历史存储到localStorage中, 需要存储id和name,每次存储时都需要在记录中多加一条,用数组push显然是比较好的方法,但localStorage不方便存储数据,于是就 ...
- vue的分页组件
<template> <div class="page-nav"> <div class="page-btn-wrap"> ...
- 从零开始一起学习SLAM | 为什么要用齐次坐标?
在涉及到计算机视觉的几何问题中,我们经常看到齐次坐标这个术语.本文介绍一下究竟为什么要用齐次坐标?使用齐次坐标到底有什么好处? 什么是齐次坐标?简单的说:齐次坐标就是在原有坐标上加上一个维度: 使用齐 ...
- (已解决)Xcode 换电脑提示 Could not attach to pid:“XXXX”错误
在运行项目时出现了如下错误 (基本上重新启动项目即可) 紧接着再次运行又没有问题了. 稍微查询了一下得知,这个问题并不是由我们的操作引起的,有时就会莫名其妙的出现,但是有一些不同的情况 下面列出如何解 ...
- RESTful 和RPC
RESTful 全称是 Resource Representational State Transfer 即资源表现状态转换 通俗来说就是 资源在网络中以某种表现形式进行状态转移 RPC 全称是Rem ...
- VirtualBox 报错VERR_VD_IMAGE_READ_ONLY
VirtualBox 无法打开虚拟机,报错VERR_VD_IMAGE_READ_ONLY,详细报错如下: 不能为虚拟电脑 Primary11gRAC2 打开一个新任务. Failed to open ...
- windows连接远程win服务器失败,win7win10都存在此问题,显示出现身份验证错误,要求的函数不受支持,可能由于CredSSP加密Oracle修正 (原)
之前电脑windows+mstsc连接另一个windows服务器正常登陆,可在更新本地系统为win10以后,登陆就出现了问题,提示的错误是,出现身份验证错误.要求的函数不受支持,可能由于CredSSP ...