题意:

邦德在逃命!他在一个有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. 关于swagger-ui 参数为中文的时候,后端乱码

    项目中用swagger-ui来测试接口,但是发现,参数是中文的时候,后台接收的时候会出现乱码. 不得改用postman,就没事了, 立贴求助,希望有人可以说下这个怎么配置. 后面发现是后端的编码过滤器 ...

  2. Apache Spark支持三种分布式部署方式 standalone、spark on mesos和 spark on YARN区别

    链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/ Spark On ...

  3. 获取 base64 的封装

    /** * 1. 如何实例化 const fileInput = await FileInput.init(fileInputEle, isMulFile) */ export class FileI ...

  4. Linux ethtool 命令

    ethtool 是用于查询及设置网卡参数的命令,常见用法如下: 注意:该命令只是临时设置,如果网卡重启就失效了,如果想要永久保存应该配置 /etc/sysconfig/network-scripts/ ...

  5. 前端 HTML form表单标签 select标签 option 下拉框

    <select></select> select里面通常跟option配合使用 <!DOCTYPE html> <html lang="en&quo ...

  6. CentOS+Uwsgi+Nginx发布Flask开发的WebAPI

    1.WebAPI 开发工具VS 于Windows环境中开发完成后使用SFTP进行同步文件到Centos中使用 2.重点:WebAPI触发的方法是为了发送Celery异步调度任务 Celery框架使用涉 ...

  7. dxRangeTrackBar使用教程

    Properties: Max:最大值 Min:最小值 Frequency:设置刻度值多大值显示PageSize:选择时跳动的区域大小 SelectionColor:选择区域颜色 ShowSelect ...

  8. jquery小结收藏

    //根据id获取控件的值,如果没有数据默认赋值为0 function getDataById(id) { var data = $("#"+id).val(); if(data== ...

  9. double类型相减有小数误差

    如 :19.9-9.9=9.9999999999999,而不是10double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差 //两个Do ...

  10. vue接口地址配一个全局的

    main.js加 if (process.env.NODE_ENV !== 'development') { Vue.prototype.URL_PREFIX = 'http://139.196.7. ...