lh的简单图论

http://10.64.70.166/problem/1112

lh的简单图论
 

Description

众所周知,集训队的lh同学txdy,有一天他在写着代码,突然哼起了raprap,哟,哟哟,你看这个碗它又大又圆,就像这个题它又短又难,skrskr,skrskr。

lhlh在着手解决一个图论的问题:

已知有一个nn个点的无向图,图中有mm条边,每条边的权值为w_iwi​。

lhlh想知道,他从点aa走到点bb,所走的最长的边长最小值是多少?

Input

第一行输入三个正整数n,m,qn,m,q,分别表示有nn个点mm条边和qq次询问。

接下来mm行,每行有三个数分别为u_iui​、v_ivi​、w_iwi​表示从点uu到点vv有一条路径边长为ww。

接下来qq行,每行有两个数aa,bb,表示lhlh想知道他从aa走到bb所走的最长的边长的最小值。

Output

输出qq行,每行一个正整数,表示他从点aa走到点bb,所走的最长的边长最小值是多少。

Sample Input 1

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1

Sample Output 1

5
5
5
4
4
7
4
5

Hint

1≤n≤15000

1≤M≤30000

1≤wi​≤1000000000

1≤q≤20000

这个题目就是比较典型的图转树,这个好像就是UVA的11354

你要用最小生成树把图转变成树,然后再用LCA处理这棵树

#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 3e4 + ;
int dp[maxn][];
ll gw[maxn][];
int deep[maxn];
int n, m, q, N;
struct node
{
int from,to;
ll dist;
node(int from=,int to=,ll dist=):from(from),to(to),dist(dist){}
}exa[maxn];
vector<node>vec[maxn];
int f[maxn];
int findx(int x)
{
return f[x] == x ? x : f[x] = findx(f[x]);
} void unite(int x,int y)
{
x = findx(x);
y = findx(y);
if (x == y) return;
f[x] = y;
} bool same(int x,int y)
{
return findx(x) == findx(y);
}
bool cmp(node a,node b)
{
return a.dist < b.dist;
} void dfs(int s)
{
for(int i=;i<=N;i++)
{
dp[s][i] = dp[dp[s][i - ]][i - ];
gw[s][i] = max(gw[s][i - ], gw[dp[s][i - ]][i - ]);
}
int len = vec[s].size();
for(int i=;i<len;i++)
{
node e = vec[s][i];
if(e.to!=dp[s][])
{
deep[e.to] = deep[s] + ;
dp[e.to][] = s;
gw[e.to][] = e.dist;
dfs(e.to);
}
}
} ll LCA(int x,int y)
{
if (x == y) return ;
if (deep[x] > deep[y]) swap(x, y);
ll ans = ;
for(int i=N;i>=;i--)//抬到同一高度
{
if(deep[x]<deep[y]&&deep[dp[y][i]]>=deep[x])
{
ans = max(ans, gw[y][i]);
y = dp[y][i];
}
}
for(int i=N;i>=;i--)//一起往上走
{
if(dp[x][i]!=dp[y][i])
{
ans = max(ans, gw[x][i]);
ans = max(ans, gw[y][i]);
x = dp[x][i];
y = dp[y][i];
}
}
if(x!=y)//最后一步
{
ans = max(ans, gw[x][]);
ans = max(ans, gw[y][]);
}
return ans;
} int main()
{
cin >> n >> m >> q;
for(int i=;i<=m;i++)
{
int a, b;
ll w;
cin >> a >> b >> w;
exa[i] = node(a, b, w);
}
for (int i = ; i <= n; i++) f[i] = i;
sort(exa + , exa + + m, cmp);
for(int i=;i<=m;i++)
{
int x = exa[i].from, y = exa[i].to;
if (same(x, y)) continue;
unite(x,y);
vec[x].push_back(node(x, y, exa[i].dist));
vec[y].push_back(node(y, x, exa[i].dist));
}
N = (log(n + 0.0)) / log(2.0);
deep[] = ;
dfs();
for(int i=;i<=q;i++)
{
int x, y;
cin >> x >> y;
ll ans = LCA(x, y);
cout << ans << endl;
}
return ;
}

lh的简单图论的更多相关文章

  1. 2249: Altruistic Amphibians 01背包的应用 + lh的简单图论 图转树求lca

    第一个 写了两个比较简单的数论题目,就是整除理论的两个题目,第一个题目比较蠢,第二个稍微要动一点脑筋 Codeforces Round #347 (Div. 2) – A. Complicated G ...

  2. cdoj1580 简单图论问题

    地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others)     ...

  3. ZROI 19.07.30 简单图论/kk

    1.最短路 NOI2019 D2T1 我被这题送Fe了/lb 只有zz才会写二维线段树,比如我. 实际上你只需要矩形取min就可以. kd-tree可以随便过,最慢的点\(0.1s\). 另外一种简单 ...

  4. [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)

    题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...

  5. CCCC L2-023. 图着色问题【set去重判不同种类个数/简单图论/判断两相邻点是否存在同色以及颜色个数】

    L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...

  6. Google Codejam 2016 Round1A Problem C BFFs 简单图论

    链接 Google Codejam 2016 Round1A Problem C BFFs 题意 n个小朋友要坐成一个圈.每个小朋友心中都有一个Best Friend Forever.要保证每个人的左 ...

  7. acm之图论基础

    1.图的定义 图 是一个顶点集合V和一个顶点间关系的集合E组成,记G=(V,E) V:顶点的有限非空集合. E:顶点间关系的有限集合(边集). 存在一个结点v,可能含有多个前驱节点和后继结点. 1顶点 ...

  8. ACRush 楼天成回忆录

    楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...

  9. BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径

    给你一个无向图,问至少加几条边可以使整个图变成一个双联通分量 简单图论练习= = 先缩点,ans = (度数为1的点的个数) / 2 这不是很好想的么QAQ 然后注意位运算的优先级啊魂淡!!!你个sb ...

随机推荐

  1. java jdk 中HashMap的源码解读

    HashMap是我们在日常写代码时最常用到的一个数据结构,它为我们提供key-value形式的数据存储.同时,它的查询,插入效率都非常高. 在之前的排序算法总结里面里,我大致学习了HashMap的实现 ...

  2. Codeup 25593 Problem G 例题5-7 求圆周率pi的近似值

    题目描述 用如下公式 4*Π = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 - 求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不 ...

  3. AJ学IOS 之微博项目实战(5)微博自定义搜索框searchBar

    AJ分享,必须精品 一:效果 用UITextField简单定义一个搜索框 二:调用: 调用的代码,很简单,直接init就可以,以后加功能自己添加就行了. - (void)viewDidLoad { [ ...

  4. 动态规划_01背包_从Dijikstra和Floyd入手,彻底理解01背包

    dp一直是短板,现在从最基础的地方开始补 给定背包总容量 M ,n个商品选择,分别有价值vi,占量wi,从中取商品放入背包,令.容量和W=Σwi不超过M,令背包中的价值和V=Σvi最大 然后取法有很多 ...

  5. php开发中如何判断 是否微信访问

    在开发中遇到了这样一个需求,仅允许在微信中访问,所以就要对微信浏览器访问进行判断,本篇博文讲述如何判断是否是微信访问. /** * 判断是否微信访问 * @return bool */ functio ...

  6. jquery 延迟执行方法

    setTimeout方法使用时需注意: //以下两种方式都行: setTimeout(function () { test(); }, ); //或者 setTimeout(); function t ...

  7. idea ------- 源码调试运行

    1.创建一个 想学 的 ,使用单步调试进行一步步学习 调整系统资源 单步调试 (F7) ,进入不了源码,调整idea 让我们可以进入底层学习 想要在源码里面添加注释,要将引用的源文件指向,我们刚才复制 ...

  8. 全网最全最细的jmeter接口测试教程以及接口测试流程详解

    一.Jmeter简介 ​ Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试. Jmeter具备高移植性,可以实现跨平台运行. Jmeter可以实 ...

  9. 当td中文字过长时,显示为省略号

    当表格中的文字过长时,可选择已省略号显示.这里是用js实现的.首先获取td中的文字长度(innerText.length),如果长度超过了设定的长度,则截取内容,加上省略号显示.示例代码如下: $(f ...

  10. 解决sublime打开文档,出现中文乱码问题

    sublime text 软件中出现中文乱码,大多是因为编码格式不支持,需要安装一个插件就可以解决中文乱码问题,推荐安装 ConvertToUtf8  安装步骤: 1.按“shift + ctrl + ...