题意:

邦德在逃命!他在一个有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的更多相关文章

  1. uva 11354 - Bond(树链拆分)

    题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...

  2. UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)

    题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...

  3. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  4. UVA 11354 Bond(MST + LCA)

    n<=50000, m<=100000的无向图,对于Q<=50000个询问,每次求q->p的瓶颈路. 其实求瓶颈路数组maxcost[u][v]有用邻接矩阵prim的方法.但是 ...

  5. UVA 11354 - Bond (最小生成树 + 树链剖分)

    题目链接~~> 做题感悟:这题開始看到时感觉不是树不优点理,一想能够用 Kruskal 处理成树 ,然后就好攻克了. 解题思路: 先用 Kruskal 处理出最小生成树.然后用树链剖分 + 线段 ...

  6. UVA 11354 Bond 最小生成树 + lca

    题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...

  7. UVA - 11354 Bond(最小生成树+LCA+瓶颈路)

    题意:N个点,M条路,每条路的危险度为路上各段中最大的危险度.多组询问,点s到点t的所有路径中最小的危险度. 分析: 1.首先建个最小生成树,则s到t的路径一定是危险度最小的. 原因:建最小生成树的最 ...

  8. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

  9. Bond UVA - 11354(LCA应用题)

    Once again, James Bond is on his way to saving the world. Bond's latest mission requires him to trav ...

随机推荐

  1. 《mongoDB》基本操作-创建/更新/删除文档

    一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo -  use db_name; 选择你要操作的集合 > use demo switched to db dem ...

  2. 20165225《Java程序设计》第三周学习总结

    20165225<Java程序设计>第三周学习总结 1.视频与课本中的学习: 遇到的问题: 问题如下,无法编译. 最后经同学点出要放在同一个打包的文件夹里,于是就运行成功了,下面是4_15 ...

  3. XE 画矩形实现拖拉改变大小(属性)

    实现原理: 1.拖一个rectangle控件,Align属性为TOP 2.拖一个Split控件,Align为Top 3.拖Rectangle,Align为Bottom 4.拖Split,Align为B ...

  4. CS0433: 类型“Microsoft.Reporting.WebForms.ReportViewer”同时存在于“c:/WINDOWS/assembly/GAC_MSIL/Microsoft.ReportViewer.WebForms/8.0.0.0_ 标签: cassembly

    CS0433: 类型“Microsoft.Reporting.WebForms.ReportViewer”同时存在于“c:/WINDOWS/assembly/GAC_MSIL/Microsoft.Re ...

  5. python面试题~反射,元类,单例

    1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...

  6. 第5章 实现windows程序的数据绑定

    1:连接式: command 对象负责对数据库的执行命令 DataReader 对象负责从数据源中读取数据 connection 对象负责链接数据库 断开式: 数据集的Dataset存放在独立的数据源 ...

  7. RN animated缩放动画

    效果图: 代码: import React, {Component} from 'react'; import { AppRegistry, StyleSheet, Text, Animated, T ...

  8. 数据库 - Navicat与pymysql模块

    一.Nabicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时, 可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 官网下载:htt ...

  9. node学习系列 搭建express

    搭建express express官网API http://expressjs.com/zh-cn/ 1.在文件夹下新建一个packages.json文件 内容为: {} 然后执行 yarn add ...

  10. WeChat-结构