传送门

这道题,先用kruskal求一遍图中的最大生成树。

然后,倍增求lca,求lca的同时求出边权的最小值。

#include <cstring>
#include <cstdio>
#include <algorithm> int n, m, cnt, q, t, k;
int f[], head[], p[][], minn[][], deep[];
bool vis[];
struct node
{
int x, y, z;
}tree[];
struct Node
{
int next, to, val;
}edge[]; inline void add(int a, int b, int c)
{
edge[cnt].val = c;
edge[cnt].to = b;
edge[cnt].next = head[a];
head[a] = cnt++;
} inline int father(int a)
{
return a == f[a] ? a : f[a] = father(f[a]);
} inline bool cmp(node a, node b)
{
return a.z > b.z;
} void kruskal()
{
int i;
for(i = ; i <= m; i++) scanf("%d %d %d", &tree[i].x, &tree[i].y, &tree[i].z);
for(i = ; i <= n; i++) f[i] = i;
std::sort(tree + , tree + m + , cmp);
for(i = ; i <= m; i++)
{
int fa = father(tree[i].x), fb = father(tree[i].y);
if(fa != fb)
{
f[fa] = fb;
add(tree[i].x, tree[i].y, tree[i].z);
add(tree[i].y, tree[i].x, tree[i].z);
}
if(k == n - ) break;
}
} void dfs(int i)
{
int j;
vis[i] = ;
for(j = head[i]; j != -; j = edge[j].next)
if(!vis[edge[j].to])
{
deep[edge[j].to] = deep[i] + ;
p[edge[j].to][] = i;
minn[edge[j].to][] = edge[j].val;
dfs(edge[j].to);
}
} void init()
{
int i, j;
for(j = ; ( << j) <= n; j++)
for(i = ; i <= n; i++)
{
p[i][j] = p[p[i][j - ]][j - ];
minn[i][j] = std::min(minn[i][j - ], minn[p[i][j - ]][j - ]);
}
} int lca(int a, int b)
{
int i, j, ret = ;
if(deep[a] < deep[b]) std::swap(a, b);
for(i = ; ( << i) <= deep[a]; i++);
i--;
for(j = i; j >= ; j--)
if(deep[a] - ( << j) >= deep[b])
{
ret = std::min(ret, minn[a][j]);
a = p[a][j];
}
if(a == b) return ret;
for(j = i; j >= ; j--)
if(p[a][j] != p[b][j])
{
ret = std::min(ret, std::min(minn[a][j], minn[b][j]));
a = p[a][j];
b = p[b][j];
}
ret = std::min(ret, std::min(minn[a][], minn[b][]));
return ret;
} int main()
{
int i, j, x1, y1;
scanf("%d %d", &n, &m);
memset(head, -, sizeof(head));
//memset(minn, 127 / 3, sizeof(minn));
kruskal();
for(i = ; i <= n; i++)
if(!vis[i])
{
deep[i] = ;
dfs(i);
}
init();
scanf("%d", &q);
for(i = ; i <= q; i++)
{
scanf("%d %d", &x1, &y1);
if(father(x1) != father(y1)) printf("-1\n");
else printf("%d\n", lca(x1, y1));
}
return ; }

换了写法

惨啊,

i >= 0 我居然nc的用 i 代替

应该是 i >= 1 用 i 代替

 #include <cstdio>
#include <cstring>
#include <algorithm> const int MAXN = , MAXM = , INF = ;
int n, m, q, cnt, tot;
int head[MAXM], to[MAXM << ], next[MAXM << ], val[MAXM << ];
int f1[MAXN], f[MAXN][], min[MAXN][], deep[MAXN]; struct node
{
int x, y, z;
}p[MAXM]; inline bool cmp(node a, node b)
{
return a.z > b.z;
} inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt++;
} inline int find(int x)
{
return x == f1[x] ? x : f1[x] = find(f1[x]);
} inline int Min(int x, int y)
{
return x < y ? x : y;
} inline void swap(int &x, int &y)
{
x ^= y ^= x ^= y;
} inline void dfs(int u)
{
int i, v;
deep[u] = deep[f[u][]] + ;
for(i = ; f[u][i]; i++)
f[u][i + ] = f[f[u][i]][i],
min[u][i + ] = Min(min[u][i], min[f[u][i]][i]);
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(!deep[v])
{
f[v][] = u;
min[v][] = val[i];
dfs(v);
}
}
} inline int lca(int x, int y)
{
int i, ans = INF;
if(deep[x] < deep[y]) swap(x, y);
for(i = ; i >= ; i--)
if(deep[f[x][i]] >= deep[y])
ans = Min(ans, min[x][i]), x = f[x][i];
if(x == y) return ans == INF ? - : ans;
for(i = ; i >= ; i--)
if(f[x][i] ^ f[y][i])
ans = Min(ans, min[x][i]),
ans = Min(ans, min[y][i]),
x = f[x][i], y = f[y][i];
ans = Min(ans, min[x][]);
ans = Min(ans, min[y][]);
return ans == INF ? - : ans;
} int main()
{
//freopen("truck.in", "r", stdin);
//freopen("truck.out", "w", stdout);
int i, x, y, fx, fy;
scanf("%d %d", &n, &m);
memset(head, -, sizeof(head));
memset(min, / , sizeof(min));
for(i = ; i <= m; i++) scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
std::sort(p + , p + m + , cmp);
for(i = ; i <= n; i++) f1[i] = i;
for(i = ; i <= m; i++)
{
fx = find(p[i].x);
fy = find(p[i].y);
if(fx ^ fy)
{
f1[fx] = fy;
tot++;
add(p[i].x, p[i].y, p[i].z);
add(p[i].y, p[i].x, p[i].z);
}
if(tot == n - ) break;
}
for(i = ; i <= n; i++)
if(!deep[i])
dfs(i);
scanf("%d", &q);
for(i = ; i <= q; i++)
{
scanf("%d %d", &x, &y);
if(find(x) ^ find(y)) puts("-1");
else printf("%d\n", lca(x, y));
}
return ;
}

NOIP2013D1T3货车运输(最大生成树+倍增lca)的更多相关文章

  1. TZOJ 4848 货车运输(最大生成树+倍增lca)

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  2. $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$

    $Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...

  3. 【NOIP2013】货车运输 最大生成树+倍增

    题目大意:给你一张n个点m条边的图,有q次询问,每次让你找出一条从x至y的路径,使得路径上经过的边的最小值最大,输出这个最大的最小值. 显然,经过的路径必然在这张图的最大生成树上. 我们求出这个图的最 ...

  4. 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA

    题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...

  5. 货车运输(最大生成树+倍增LCA)

    看到第一篇题解的神奇码风--我决定发一篇码风正常的题解造福人类 这题的做法也非常经典,最大生成树\(+LCA\),相当于先贪心一下,在LCA的时候记录一下当前最小的边权 顺便吐槽一下最后一个测试点: ...

  6. 【洛谷1967】货车运输(最大生成树+倍增LCA)

    点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...

  7. 货车运输 noip2013 luogu P1967 (最大生成树+倍增LCA)

    luogu题目传送门! 首先,题目让我们求每个货车的最大运输量,翻译一下就是求路径上边权最小的边. 利用一下贪心思想可知,所有货车肯定都会尽量往大的边走. 进一步翻译,即为有一些小边货车根本不会走,或 ...

  8. 【NOIP2013】货车运输 最大生成树+LCA

    题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...

  9. Luogu1967 NOIP2013 货车运输 最大生成树、倍增

    传送门 题意:给出一个$N$个节点.$M$条边的图,$Q$次询问,每一次询问两个点之间的所有可行路径中经过的边的边权的最小值中的最大值.$N \leq 10000 , M \leq 50000 , Q ...

随机推荐

  1. apache http server2.2 + tomcat5.5 性能调优

    httpd加tomcat做负载均衡,采用session复制方式共享session,采用http-proxy连接方式,打开status mod 一.没有做httpd和tomcat的启动参数修改,包括jv ...

  2. RabbitMq+Haproxy负载均衡

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...

  3. 洛谷P2762 太空飞行计划问题(最大权闭合图)

    题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...

  4. vue中引入字体图标报错,找不到字体文件

    在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...

  5. 【Jenkins】Jenkins配置从节点,实现远程主机调用功能

    一.需求 使用Jenkins进行持续集成部署过程中,需要用到远端主机的处理功能.如部署到远程主机.文件备份等功能 二.思路 1.当远端主机为Linux系统时使用Publish Over SSH Plu ...

  6. JS正则表达式匹配<div><style>标签

    测试字符串: <style>v\:* {                 BEHAVIOR: url(#default#VML) } o\:* {                 BEHA ...

  7. 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  8. javaee 第11周

    1.JPQL查询 JPQL全称Java Persistence Query Language 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移 ...

  9. MVC之在实例中的应用

    MVC模式在Java Web应用程序中的实例分析 1. 结合六个基本质量属性 1)可用性 2)可修改性 3)性能 4)安全性 5)可测试性 6)易用性 2. 分析具体功能模块的MVC设计实现(例如登录 ...

  10. 「 Luogu P2574 」 XOR的艺术——线段树

    # 解题思路 这题不难,但是原谅我一开始的傻逼想法,一会儿再给大家透露透露. 先说怎么做这题. 显然对于 $0$ 和 $1$ 来说,异或无非也就只有两种变化 异或了奇数次,$0$ 就会变成 $1$,$ ...