https://www.luogu.org/problemnew/show/1967

/*这道题的基本思路在于求最大生成树,构建最大生成树的图然后问题相当于转化成求两点之间一条链上的最小值,因为这是已经构建出了最大生成树。利用倍增的思想,g[i][j]表示i,这个点向上跳j步,这之间的最小值,与求lca的f[i][j]很像(基本一样的) 自己yy不难理解
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>using namespace std;
const int N = 1e4 + 10;#define oo 99999999struct Node{int u, v, w;
}S[N * 5];
struct Edge{int u, v, w, nxt;
}E[N << 1];int now = 1, n, m, js;
int head[N], p[N], f[N][25], g[N][25], deep[N];inline int read(){int x = 0; char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') x = x * 10 + c - '0', 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 = 1, doen = 1; i <= (m << 1) && 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][0] = u;g[v][0] = E[i].w;make_deep(v, depth + 1);} }
}inline void make_jump(){for(int j = 1; (1 << j) <= n; j ++)for(int i = 1; i <= n; i ++)if(f[i][j - 1]) f[i][j] = f[f[i][j - 1]][j - 1], g[i][j] = min(g[i][j - 1], g[f[i][j - 1]][j - 1]);
}inline int lca(int x, int y){int ret = oo;if(x == y) return 0;if(deep[x] < deep[y]) swap(x, y);int k = log2(deep[x]);for(int i = k; i >= 0; i --){if(deep[f[x][i]] >= deep[y]){ret = min(ret, g[x][i]);x = f[x][i];}}if(x == y) return ret;for(int i = k; i >= 0; i --){if(f[x][i] != f[y][i]){ret = min(ret, min(g[x][i], g[y][i]));x = f[x][i];y = f[y][i];}}ret = min(ret, min(g[x][0], g[y][0]));return ret;
}int main()
{n = read();m = read();for(int i = 1; i <= n; i ++) head[i] = -1, p[i] = i;for(int i = 1; i <= m; i ++) S[i].u = read(), S[i].v = read(), S[i].w = read();sort(S + 1, S + m + 1, cmp);Kruskal();for(int i = 1; i <= n; i ++) if(!deep[i]) make_deep(i, 1); make_jump();int T = read();while(T --){int x = read(), y = read();if(getf(x) != getf(y)){printf("-1\n");continue ;}int answer = lca(x, y);printf("%d\n", answer);}return 0;
}

转载于:https://www.cnblogs.com/shandongs1/p/7989653.html

[noip-2013] 货车运输相关推荐

  1. [NOIp 2013]货车运输

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

  2. NOIP 2013 货车运输

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

  3. NOIP 2013 提高组 货车运输

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

  4. noip 2013 洛谷 P1967 货车运输

    题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...

  5. LUOGU 1967 货车运输 [noip 2013]

    * 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...

  6. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  7. [Codevs] 3287 货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城 ...

  8. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  9. 倍增LCA NOIP2013 货车运输

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

  10. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

最新文章

  1. Redis安装整理(window平台) +php扩展redis
  2. insightface mxnet训练 旧版
  3. 【转】线性代数的几何意义
  4. HTML和URL比较
  5. Istio 1.9 发布——重点改善 Istio 的 Day2 操作
  6. React.js 入门与实战课程思维导图
  7. 递归入门 斐波那契数列
  8. 金蝶携手工商银行完成首单数字人民币费用报销业务
  9. 设计模式——单例模式详解
  10. php与数据库如何连接,PHP中如何连接数据库
  11. oracle 执行sql路径,如何指定 SQL 执行路径
  12. hive血缘关系之输入表与目标表的解析
  13. c语言 ++ --运算符_C / C ++中的按位运算符
  14. python爬虫-- 爬取51job网招聘信息
  15. java sql注入 过滤器_java 过滤器filter防sql注入 | 学步园
  16. VS2010 上手案例---hello word
  17. python gephi可视化 金庸人物关系图
  18. Epub360、iH5、Mugeda,三款专业级H5设计工具详评
  19. [转载]美国夫妻生活如何在钱上更亲密
  20. python统计大写辅音字母_大写

热门文章

  1. 在MongoDB的MapReduce上踩过的坑
  2. LVS_DR实现过程...
  3. Android 源代码中的res
  4. HDUOJ--汉诺塔II
  5. Ajax(从json中提取数据)
  6. Web后端学习笔记 Flask(11)Local线程隔离对象
  7. 云大计算机昆工,云南最好的7所大学,分3档!本地人青看中昆医大,外省更爱昆工!...
  8. pip工具可以打包python源代码吗_将python源文件打包成exe文件
  9. android版本迭代,多盟:android2.3仍是主流 iOS新版本迭代加
  10. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc