http://www.lydsy.com/JudgeOnline/problem.php?id=3732

/*
Kruskal 最小生成树
树链剖分 最大值查询
注意:可能会有几块不联通的图
*/ #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime> using namespace std;
const int N = ; #define gc getchar()
#define lson jd << 1
#define rson jd << 1 | 1 int n, m, k, now = , tim, ans;
int bef[N], data[N], fat[N], head[N], tree[N], topp[N], fa[N], son[N], siz[N], deep[N];
struct Node_1{int u, v, w;} E[N << ];
struct Node_2{int u, v, w, nxt;} G[N << ];
struct Node_3{int l, r, Max;} T[N << ]; bool cmp(Node_1 a, Node_1 b) {return a.w < b.w;} struct Bzoj_3732{ inline int read(){
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} inline int getf(int x) {return fat[x] == x ? x : fat[x] = getf(fat[x]);}
inline void add(int u, int v, int w) {G[now].v = v; G[now].w = w; G[now].nxt = head[u]; head[u] = now ++;} inline void Kruskal(){
int js();
for(int i = ; i <= m; i ++){
int u = E[i].u, v = E[i].v;
int fu = getf(u), fv = getf(v);
if(fu != fv) {
js ++; fat[fu] = fv;
add(u, v, E[i].w);
add(v, u, E[i].w);
}
if(js == n - ) return ;
}
} void dfs_find_son(int u, int f_, int dep){
fa[u] = f_;
deep[u] = dep;
siz[u] = ;
for(int i = head[u]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(v != f_){
data[v] = G[i].w;
dfs_find_son(v, u, dep + );
siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
} void dfs_to_un(int u, int tp){
topp[u] = tp;
tree[u] = ++ tim;
bef[tim] = u;
if(!son[u]) return ;
dfs_to_un(son[u], tp);
for(int i = head[u]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(v != fa[u] && v != son[u]) dfs_to_un(v, v);
}
} void build_tree(int l, int r, int jd){
T[jd].l = l; T[jd].r = r;
if(l == r) {T[jd].Max = data[bef[l]]; return ;}
int mid = (l + r) >> ;
build_tree(l, mid, lson);
build_tree(mid + , r, rson);
T[jd].Max = max(T[lson].Max, T[rson].Max);
} void Sec_A(int l, int r, int jd, int x, int y){
if(x <= l && r <= y) {ans = max(ans, T[jd].Max); return ;}
int mid = (l + r) >> ;
if(x <= mid) Sec_A(l, mid, lson, x, y);
if(y > mid) Sec_A(mid + , r, rson, x, y);
} inline int Sec_A_imp(int x, int y){
int tp1 = topp[x], tp2 = topp[y], ret = ;
while(tp1 != tp2){
if(deep[tp1] < deep[tp2]) swap(x, y), swap(tp1, tp2);
ans = ;
Sec_A(, n, , tree[tp1], tree[x]);
ret = max(ans, ret);
x = fa[tp1];
tp1 = topp[x];
}
if(x == y) return ret;
if(deep[x] < deep[y]) swap(x, y);
ans = ;
Sec_A(, n, , tree[y] + , tree[x]);
ret = max(ret, ans);
return ret;
}
}AC; int main()
{
n = AC.read(), m = AC.read(); k = AC.read();
for(int i = ; i <= n; i ++) fat[i] = i, head[i] = -;
for(int i = ; i <= m; i ++)
E[i].u = AC.read(), E[i].v = AC.read(), E[i].w = AC.read();
sort(E + , E + m + , cmp);
AC.Kruskal();
for(int i = ; i <= n; i ++) if(!deep[i]) AC.dfs_find_son(i, , );
for(int i = ; i <= n; i ++) if(!topp[i]) AC.dfs_to_un(i, i);
AC.build_tree(, n, );
while(k --){
int x = AC.read(), y = AC.read();
int Answer = AC.Sec_A_imp(x, y);
printf("%d\n", Answer);
} return ;
}

与noip2013货车运输相似(一模一样)

货车运输:最大生成树 + 最小值查询

此题       :最小生成树 + 最大值查询

货车运输改几行代码就A了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string> using namespace std;
const int N = ; #define oo 99999999 struct Node{
int u, v, w;
}S[N << ];
struct Edge{
int u, v, w, nxt;
}E[N << ]; int now = , n, m, js;
int head[N], p[N], f[N][], g[N][], deep[N]; inline int read(){
int x = ; char c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline bool cmp(Node a, Node b){
return a.w < b.w;
} int getf(int x){
return p[x] == x ? x : p[x] = getf(p[x]);
} void add(int u, int v, int w){
E[now].v = v;
E[now].w = w;
E[now].nxt = head[u];
head[u] = now ++;
} inline void Kruskal(){
for(int i = , doen = ; i <= (m << ) && doen < n; i ++){
int u = S[i].u, v = S[i].v;
int pu = getf(u), pv = getf(v);
if(pu != pv){
p[pu] = pv;
add(u, v, S[i].w);
add(v, u, S[i].w);
doen ++;
}
}
} void make_deep(int u, int depth){
deep[u] = depth;
for(int i = head[u]; ~ i; i = E[i].nxt){
int v = E[i].v;
if(!deep[v]){
f[v][] = u;
g[v][] = E[i].w;
make_deep(v, depth + );
}
}
} inline void make_jump(){
for(int j = ; ( << j) <= n; j ++)
for(int i = ; i <= n; i ++)
if(f[i][j - ]) f[i][j] = f[f[i][j - ]][j - ], g[i][j] = max(g[i][j - ], g[f[i][j - ]][j - ]);
} inline int lca(int x, int y){
int ret = -;
if(x == y) return ;
if(deep[x] < deep[y]) swap(x, y);
int k = log2(deep[x]);
for(int i = k; i >= ; i --){
if(deep[f[x][i]] >= deep[y]){
ret = max(ret, g[x][i]);
x = f[x][i];
}
}
if(x == y) return ret;
for(int i = k; i >= ; i --){
if(f[x][i] != f[y][i]){
ret = max(ret, max(g[x][i], g[y][i]));
x = f[x][i];
y = f[y][i];
}
}
ret = max(ret, max(g[x][], g[y][]));
return ret;
} int main()
{
n = read();
m = read();
int T = read();
for(int i = ; i <= n; i ++) head[i] = -, p[i] = i;
for(int i = ; i <= m; i ++) S[i].u = read(), S[i].v = read(), S[i].w = read();
sort(S + , S + m + , cmp);
Kruskal();
for(int i = ; i <= n; i ++) if(!deep[i]) make_deep(i, );//可能会有多块
make_jump();
while(T --){
int x = read(), y = read();
int answer = lca(x, y);
printf("%d\n", answer);
}
return ;
}

[bzoj] Network的更多相关文章

  1. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  2. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  3. bzoj 1162 network

    树上的区间第k小数,以前写的主席树是一直MLE的,后来看到一种在初始化的时候的优化:直接DFS这颗树,得到每个点的主席树,然后更新的时候另外对DFS序建主席树,答案加上初始每个点的主席树,这样在初始化 ...

  4. BZOJ 3732 Network

    2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...

  5. BZOJ 3732: Network 最小生成树 倍增

    3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...

  6. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 870  Solved: 299[Submit] ...

  7. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  8. BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)

    第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然  后跑最小费用最大流就OK了. ---- ...

  9. 【BZOJ】3732: Network【Kruskal重构树】

    3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Dis ...

随机推荐

  1. TZOJ1299: 畅通工程

    #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> #i ...

  2. 邮件标准协议:MIME(Multipurpose Internet Mail Extensions)

    MIME(多用途互联网邮件扩展)指的是一系列电子邮件技术规范 ,主要包括 RFC 2045~2049   传统的电子邮件只能使用 ASCII 字符,导致非英文字符都不能在电子邮件中使用 而且电子邮件中 ...

  3. javascript 之 Object.defineProperty

    语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...

  4. core直接获取报异常数据

    报异常直接跳转到/Home/Error [ResponseCache(Duration = , Location = ResponseCacheLocation.None, NoStore = tru ...

  5. 转 winfrom组件圆角

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. mysql 查询表的字段名称,字段类型

    select column_name,column_comment,data_type from information_schema.columns where table_name='查询表名称' ...

  7. impala 表迁移方式 partquet数据文件移动方法

    1.原表查询:select count(*) from edm.ucard_wxd0123 where stat_dt = '2024-01-09' and id_no = '110101199003 ...

  8. AJAX中错误代码解释以及http中的错误代码解释

    xmlhttp.readyState的值及含义: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...

  9. http接口测试工具-Advanced-REST-client

    非常好用的http接口测试工具 相信作为一个java开发人员,大家或多或少的要写或者接触一些http接口.而当我们需要本地调试接口常常会因为没有一款好用的工具而烦恼.今天要给大家介绍一款非常好用.实用 ...

  10. mysql安装和遇到的问题处理

    遇到需要在新系统上安装MySQL的事情,简单记录一下过程. 声明:最好的文档是官方文档,我也是看的官方文档,只是中间遇到点问题,记录一下出现的问题和处理方式.贴一些官方文档地址. 用tar包的安装方式 ...