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 ...
随机推荐
- 了解一下mock
1.mock简介: mock测试就是在测试过程中,对于某些不容易构成或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mo ...
- Linux C++ 网络编程学习系列(4)——多路IO之epoll基础
epoll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll 源码说明: server.cpp: 监听127.1:6666,功 ...
- AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
AJ分享,必须精品 一:效果 第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了. 这里主要实现滑动回 ...
- jquery的焦点图片无限循环关键思维
在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...
- First Training
B B - Local Extrema CodeForces - 888A You are given an array a. Some element of this array ai is a l ...
- 如何将SqlServer配置为django的数据源(2.2以后版本)
django-pyodbc-azure 是一个官方推荐的 第三方django数据库支持backend. 根据官网的介绍django-pyodbc-azure 只能支持到 django 2.1.如果涉及 ...
- 基于nodejs的游戏服务器
开源一个四年前自己写的node服务器,有兴趣的可以继续开发-- 架构为mysql,redis,node. 数据格式为 protocol buff 如果只做简单的演示,这个架构非常适合你.. 还是typ ...
- MySQL笔记总结-DDL语言
DDL语言 数据类型 一.数值型 1.整型 tinyint.smallint.mediumint.int/integer.bigint 1 2 3 4 8 特点: ①都可以设置无符号和有符号,默认有符 ...
- RSA非对称可逆加密
/// <summary> /// RSA ECC /// 可逆非对称加密 /// 非对称加密算法的优点是密钥管理很方便,缺点是速度慢. /// </summary> usin ...
- python 携程asyncio实现高并发示例1
import asyncio #携程(携程不是函数) async def print_hello(): while True: print("hello world") await ...