lh的简单图论
lh的简单图论
http://10.64.70.166/problem/1112
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的简单图论的更多相关文章
- 2249: Altruistic Amphibians 01背包的应用 + lh的简单图论 图转树求lca
第一个 写了两个比较简单的数论题目,就是整除理论的两个题目,第一个题目比较蠢,第二个稍微要动一点脑筋 Codeforces Round #347 (Div. 2) – A. Complicated G ...
- cdoj1580 简单图论问题
地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others) ...
- ZROI 19.07.30 简单图论/kk
1.最短路 NOI2019 D2T1 我被这题送Fe了/lb 只有zz才会写二维线段树,比如我. 实际上你只需要矩形取min就可以. kd-tree可以随便过,最慢的点\(0.1s\). 另外一种简单 ...
- [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)
题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...
- CCCC L2-023. 图着色问题【set去重判不同种类个数/简单图论/判断两相邻点是否存在同色以及颜色个数】
L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...
- Google Codejam 2016 Round1A Problem C BFFs 简单图论
链接 Google Codejam 2016 Round1A Problem C BFFs 题意 n个小朋友要坐成一个圈.每个小朋友心中都有一个Best Friend Forever.要保证每个人的左 ...
- acm之图论基础
1.图的定义 图 是一个顶点集合V和一个顶点间关系的集合E组成,记G=(V,E) V:顶点的有限非空集合. E:顶点间关系的有限集合(边集). 存在一个结点v,可能含有多个前驱节点和后继结点. 1顶点 ...
- ACRush 楼天成回忆录
楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...
- BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径
给你一个无向图,问至少加几条边可以使整个图变成一个双联通分量 简单图论练习= = 先缩点,ans = (度数为1的点的个数) / 2 这不是很好想的么QAQ 然后注意位运算的优先级啊魂淡!!!你个sb ...
随机推荐
- AJ学IOS 之CoreLocation指南针小应用
AJ分享,必须精品 一:效果图示 简单的用到CoreLocation获取方位做的指南针小应用 二:制作思路 具体用到了CoreLocation相关的知识,请看上一篇博客有写 然后获取方向不需要进行授权 ...
- Linux 下迁移 Nexus3
Nexus3 的迁移过程还是非常简单,复制整个目录到新服务器,启动即可. 备份 在原来服务器上将 nexus3 整体目录备份即可. $ tar -zcvf nexus3.tar.gz nexus3/ ...
- sublime text3添加并修改编译系统
版权声明:本文为CSDN博主「肥宅_Sean」的原创文章,遵循 CC 4.0 BY-SA 版权协议,原文链接 方法工具 -> 编译系统 -> 新建编译系统 按ctrl+s保存.(注意,这里 ...
- 图2-4TCP状态转换图
这张图中描述了TCP中11个状态的转换. 光看这个图我一开始是蒙蔽的,也没有写服务器和客户端的操作流程.不过回头一想,是状态转换,也就是从一个状态到另外一个状态发生了什么,什么条件触发的.这样是不是好 ...
- Laravel 上手增删改查
拿到一个框架,除了解框架,还要能实现基本的CURD操作. 添加 1.配置路由,指定添加页面: // routes/web.php 中增加如下: // 添加页面.存放路径 Laravel7/resour ...
- 使用dynamic和MEF实现轻量级的AOP组件 (2)
转摘 https://www.cnblogs.com/niceWk/archive/2010/07/21/1782092.html 偷梁换柱 上一篇我们初试了DynamicAspect这把小刀,如果你 ...
- 当td中文字过长时,显示为省略号
当表格中的文字过长时,可选择已省略号显示.这里是用js实现的.首先获取td中的文字长度(innerText.length),如果长度超过了设定的长度,则截取内容,加上省略号显示.示例代码如下: $(f ...
- Selenium常见报错问题(1)- 先来认识下selenium常见异常类
如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...
- NGINX反向代理,后端服务器获取真实IP
一般使用中间件做一个反向代理后,后端的web服务器是无法获取到真实的IP地址. 但是生产上,这又是不允许的,那么怎么解决? 1.在NGINX反向代理服务器上进行修改 2.修改后端web服务器配置文件 ...
- Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...