NOIP2013 D1T3 货车运输 zz耻辱记
先来证明下lemma: 图上2点间最小边权最大的路径一定在MST上
感性理解下:
每次kruskal algo都连接最大的不成环边
此时有2个未联通的联通块被连起来.
那么考虑u, v两点的联通块 : 它们并起来时选的边最大. (将比这条边大的边加入生成树不能使得u,v联通)
这个思想是kruskal重构树的基础(每个联通块选取一个代表点)
sb题, 但是做的噎屎了, 花了1.5h
我还是应该熟悉一下 最小生成树, 树上倍增和并查集
2个sb错误:
- 见code l58
- 并查集没初始化
code
//file headers start
#include<bits/stdc++.h>
using namespace std;
#define rep(i, _st, _ed) for(register int i = (_st); i <= (_ed); ++i)
int read(){
int f = 1, ans = 0; char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -1;
c = getchar();
}
while(isdigit(c)) {
ans = ans * 10 + c - '0';
c = getchar();
}
return ans * f;
}
void put(int num) { printf("%d\n", num); }
void testread() { while(1) { int k = read(); put(k); if(!k) break;}}
const int maxn = 10005, maxm = 50005;
struct graph{
int v, nxt, w;
}edge[maxm*2];
int head[maxn], n, m;
void adde(int u, int v, int w){
static int cnt = 0;
edge[++cnt].v = v, edge[cnt].w = w;
edge[cnt].nxt = head[u], head[u] = cnt;
}
//file headers end
struct ee{
int u, v, w;
bool operator<(const ee &rhs)const{return w>rhs.w;}
}e[maxm];
int fa[maxn];
int find(int u) {return (fa[u]==u)?u:fa[u] = find(fa[u]);}
int dep[maxn], f[21][maxn], vis[maxn], d[21][maxn];
void dfs(int u, int fa){
dep[u] = dep[fa]+1, vis[u] = 1;
f[0][u] = fa;
for(int i = head[u]; i; i = edge[i].nxt){
if(edge[i].v!=fa)dfs(edge[i].v, u), d[0][edge[i].v] = edge[i].w;
}
}
int lcapth(int u, int v){
int ans = 1e9;
if(dep[u] < dep[v]) swap(u, v);
int i = 20;
for(i = 20; i >= 0; i--)
if(dep[f[i][u]] >= dep[v]) ans = min(ans, d[i][u]), u = f[i][u];
if(u == v) return ans;
for(i = 20; i >= 0; i--){
if(f[i][u] != f[i][v] ) { //omg 这里是f[i][u]不是dep[f[i][u]]
ans = min(ans, d[i][u]), ans = min(ans, d[i][v]);
u = f[i][u], v = f[i][v];
}
}
return min(ans, min(d[0][u], d[0][v]));
}
signed main(){
//fileop("test");
n = read(), m = read();
rep(i, 1, m) {
int u = read(), v = read(), w = read();
e[i].u = u, e[i].v = v, e[i].w = w;
}
sort(e+1, e+m+1);
rep(i, 1, n) fa[i] = i; //don't forget initialize bcj!!!
rep(i, 1, m){
if(find(e[i].v) != find(e[i].u)){
adde(e[i].u, e[i].v, e[i].w), adde(e[i].v, e[i].u, e[i].w);
fa[find(e[i].v)] = find(e[i].u);
//printf("%d %d\n", e[i].u, e[i].v);
}
}
rep(i, 1, n) if(vis[i] == 0) dfs(i, 0), f[0][i] = i, d[0][i] = 1e9; //root should form self loop
rep(i, 1, 20)rep(j, 1, n) f[i][j] = f[i-1][f[i-1][j]], d[i][j] = min(d[i-1][j], d[i-1][f[i-1][j] ]);
int q = read();
while(q--){
int u = read(), v = read();
if(find(u) == find(v)) put(lcapth(u, v));
else put(-1);
}
return 0;
}
/*
5 7
4 3 4440
3 1 22348
1 3 28368
2 4 25086
5 3 6991
4 3 10638
3 1 11106
4
4 5
1 3
5 4
2 5
*/
NOIP2013 D1T3 货车运输 zz耻辱记的更多相关文章
- NOIP2013 D1T3 货车运输
[NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...
- NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...
- xsy 2018 【NOIP2013】货车运输
[NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...
- 【NOIP2013】货车运输
感觉这题挺水的……真的挺水的…… 原题: A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车 ...
- 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输
题面 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆 ...
- 【NOIP2013】货车运输 最大生成树+LCA
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
- $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$
$Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...
- [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增
Problem 树上倍增 题目大意 给出一个图,给出若干个点对u,v,求u,v的一条路径,该路径上最小的边权值最大. Solution 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...
- 【NOIP2013】货车运输 最大生成树+倍增
题目大意:给你一张n个点m条边的图,有q次询问,每次让你找出一条从x至y的路径,使得路径上经过的边的最小值最大,输出这个最大的最小值. 显然,经过的路径必然在这张图的最大生成树上. 我们求出这个图的最 ...
随机推荐
- java 代码
java 里的 pandas tablesaw DataFrame 再有就是 spark 了 java 代码规范 Java8特性详解 lambda表达式 Stream Sonar 规则检测 sprin ...
- 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...
- Linux之防火墙管理篇[Ubuntu:ufw]
前言 由于近期,腾讯云服务器就要到期了,学生优惠即将失效了,所以准备将数据库和项目迁移到vultr上.然而,在使用nivicat连接mysql数据库的过程中,却屡次出现:Can't connect t ...
- 记一场与 cookie 的相遇
简介: cookie 翻译过来为 “小甜点,一种酥性甜饼干,很美味的...”,咳咳,打住!我们这里说的是 “甜点” 文件,它是浏览器储存在用户电脑上的一小段纯文本格式的文件. 由于 http 是一种无 ...
- 风火轮SMC532使用
2018年3月份申请了一个院创,要做一个基于NFC技术的考勤设备,想法是用手机的NFC将学号信息传导考勤机,由考勤机统计缺勤信息,因为自己的拖延症,一直拖到现在.现在一边写毕业论文一边准备院创答辩,又 ...
- C# 用Serializer.ToXml()方法转换成两种格式的XML
常见XML格式两种: 这种是属性的格式,实体的Model属性上面加上这个特性 [XmlAttribute] <AAA aa="/> 这种是标签的格式,实体的Model属性上面加上 ...
- m3u8下载转码一次完成
最近看到有部分网站开始加入视频解析服务,虽然这种服务会损害土豆优酷等视频托管商的权益,但是,烦人的广告也让我们开始寻找有没有什么比较靠谱的解决方法~实际上很多网站都在使用m3u8文件格式,里面都是视频 ...
- java各种数据类型的数组元素的默认值
public class DataTypeDefaultValue { public static void main(String[] args) { // string类型数组的默认值null / ...
- virtualenv安装及使用
环境 Windows 10 python 3.6.7 安装 virtualenv用于创建虚拟环境,用于隔离不同的python版本的运行,是容器类软件.这里在Windows下通过pip安装: pip i ...
- 使用 eclipse 的常用操作
1.创建项目 https://blog.csdn.net/tsundere_ning/article/details/79587060 2. 常用代码块创建编辑 使得eclipse 相应, 点击右上角 ...