题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=7

题意:中文题面。

手动画一下会发现所求边必然存在于最大生成树上,那么就可以首先构造一棵最大生成树。

问题转化成一棵树上求两个点之间的链上的最短边,用倍增lca就可以做了,但是我不会。

于是可以考虑建树时的操作,在求最大生成树的时候按秩合并,即集合大的根要做集合小的根的父亲,这样连一条有向边。因为最大声成树是从大到小遍历的,所以能保证点与点相连的链上的最短的那条边一直被更新着,并且能够维持整棵树高不会超过log(n)。

然后dfs预处理一下,查询的时候求lca,每次维护最短的边即可。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 typedef long long LL;
  5 typedef struct Edge {
  6     int u, v, w, next;
  7 }Edge;
  8 const int maxn = 50500;
  9 const int maxm = 200200;
 10 int h1[maxn], h2[maxn], pre[maxn], rk[maxn];
 11 int n, m, q, ecnt1, ecnt2;
 12 int depth[maxn], dis[maxn];
 13 Edge e[maxm<<1], ee[maxn<<1];
 14
 15 void init() {
 16     for(int i = 1; i <= n; i++) pre[i] = i;
 17     memset(h1, -1, sizeof(h1));
 18     memset(h2, -1, sizeof(h2));
 19     memset(rk, 0, sizeof(rk));
 20     memset(depth, 0, sizeof(depth));
 21     memset(dis, 0, sizeof(dis));
 22     ecnt1 = ecnt2 = 0;
 23 }
 24
 25 void a1(int u, int v, int w) {
 26     e[ecnt1].u = u, e[ecnt1].v = v, e[ecnt1].w = w;
 27     e[ecnt1].next = h1[u], h1[u] = ecnt1++;
 28 }
 29
 30 void a2(int u, int v, int w) {
 31     ee[ecnt2].u = u, ee[ecnt2].v = v, ee[ecnt2].w = w;
 32     ee[ecnt2].next = h2[u], h2[u] = ecnt2++;
 33 }
 34
 35 bool cmp(Edge a, Edge b) { return a.w > b.w; }
 36 int find(int x) { return x == pre[x] ? x : pre[x] = find(pre[x]); }
 37
 38 int unite(int x, int y, int w) {
 39     x = find(x); y = find(y);
 40     if(x != y) {
 41         if(rk[x] >= rk[y]) {
 42             if(rk[x] == rk[y]) rk[x]++;
 43             pre[y] = x, a2(x, y, w);
 44         }
 45         else pre[x] = y, a2(y, x, w);
 46         return 1;
 47     }
 48     return 0;
 49 }
 50
 51 void dfs(int u, int p) {
 52     for(int i = h2[u]; ~i; i=ee[i].next) {
 53         int v = ee[i].v, w = ee[i].w;
 54         if(p == v) continue;
 55         depth[v] = depth[u] + 1;
 56         dis[v] = w; pre[v] = u;
 57         dfs(v, u);
 58     }
 59 }
 60
 61 int query(int u, int v) {
 62     int ret = 0x7f7f7f7f;
 63     if(depth[u] < depth[v]) swap(u, v);
 64     while(depth[u] > depth[v]) {
 65         ret = min(ret, dis[u]);
 66         u = pre[u];
 67     }
 68     while(u != v) {
 69         ret = min(ret, min(dis[u], dis[v]));
 70         u = pre[u]; v = pre[v];
 71     }
 72     return ret;
 73 }
 74
 75 int main() {
 76     // freopen("in", "r", stdin);
 77     int u, v, w;
 78     while(~scanf("%d%d%d",&n,&m,&q)) {
 79         init();
 80         for(int i = 0; i < m; i++) {
 81             scanf("%d%d%d",&u,&v,&w);
 82             a1(u, v, w); a1(v, u, w);
 83         }
 84         sort(e, e+ecnt1, cmp);
 85         int mst = 0;
 86         for(int i = 0; i < ecnt1; i++) {
 87             u = e[i].u; v = e[i].v; w = e[i].w;
 88             if(unite(u, v, w)) mst += w;
 89         }
 90         int rt = find(1);
 91         memset(pre, -1, sizeof(pre));
 92         depth[rt] = 1;
 93         dfs(rt, 0);
 94         while(q--) {
 95             scanf("%d%d",&u,&v);
 96             printf("%d\n", query(u, v));
 97         }
 98     }
 99     return 0;
100 }

转载于:https://www.cnblogs.com/kirai/p/6935315.html

[2017浙工大之江学院决赛 H] qwb与学姐(并查集,按秩合并,最小生成树,LCA)...相关推荐

  1. 计算机网络鲍卫兵答案,之江浙工大之江学院1314(1)课程表校区1.doc

    PAGE PAGE 1 浙江工业大学之江学院2013/2014学年(1)学期课程表汇总 1 审批 星期 班级 节次 一 二 三 四 五 P 1.2节 3.4(5)节 6.7节 8.9节 1.2节 3. ...

  2. 浙工大计算机学院 张晖,计算机学院(软件学院)IMUDGES新品发布会成功举办

    2018年10月20日晚18点,2018年内蒙古大学优秀文化建设项目--精英开发者联盟新品发布会于内蒙古大学北校区综合楼3楼阶梯教室顺利召开,本次发布会由内蒙古大学精英学生开发者联盟举办.计算机学院( ...

  3. 南工大计算机学院,江南-欢迎访问湖北工业大学计算机学院官方网站

    科研情况介绍(研究方向.研究课题.现正进行的科研项目) 研究方向: 计算机软件与理论. 近3年来主要个人成果.参加学术团体及社会兼职情况: 1.机械化定理证明研究综述.第一作者.软件学报. 2019 ...

  4. 合工大计算机学院导师詹曙,合肥工业大学计算机与信息学院导师教师师资介绍简介-△郭艳蓉...

    合肥工业大学计算机与信息学院导师教师师资介绍简介-△郭艳蓉本站小编 Free考研考试/2021-04-24 个人信息 姓 名 郭艳蓉 性 别 女 出生年月 最终学位 博士 毕业学校 合肥工业大学 从事 ...

  5. 浙工大计算机类包含哪些专业,浙江工业大学计算机类专业培养计划

    计算机类专业培养计划 一.培养目标 计算机大类本科专业设有计算机科学与技术.软件工程.网络工程.数字媒体四个本科专业,是浙江省高校中最早开设本科层次专业教育的学校之一.为了培养厚基础.宽口径.强能力. ...

  6. 川大计算机学院夏令营感谢,【学长学姐经验分享】海纳百川,有容乃大—四川大学夏令营经验分享...

    一.个人情况 专业:三流师范类211院校人力资源管理 排名情况:2/31(参加夏令营与九推时都为此排名) 科研:大创项目A类一项.B类一项 英语:四级563,六级464 荣誉:国家励志奖学金两次 二. ...

  7. 双非高校浙工大,一年2项研究上Nature,校友纷纷打Call:欠一个211名头

    杨净 发自 凹非寺  量子位 报道 | 公众号 QbitAI 中国高校4篇论文同日登Nature ,本已不寻常. 没想到的是,这4篇入选论文中,还有一篇大气物理方面的论文,由于其主要作者和通讯作者来自 ...

  8. 浙江工业大学之江学院2017年第0届达内杯A题——qwb与支教

    Problem A: qwb与支教 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1617  Solved: 332 [Submit][Status] ...

  9. 最“燃”研究生!浙工大 64 岁研究生毕业,老师称其毕业论文写的最好

    点击上方"视学算法",选择"星标"公众号 重磅干货,第一时间送达 ‍ 整合 | 募格学术 来源 | 中国新闻网.杭州网 "如果能重选一次,我依旧会选择 ...

  10. 2008年 浙工大考研计算机专业课试题C++

    2008年 浙工大考研计算机专业课试题C++ 个人闲暇之余整理,可能会有许多细节问题且题目实现代码不唯一,若有需要可邮件与我交流. 一,改程序错误 1-1,计算半径为(a+b)的圆的面积 // kao ...

最新文章

  1. 大失所望:第一次去苹果店“享受”维修服务的经历
  2. irobot擦地机器人故障_自己动手修复 iRobot braava380t 电机故障
  3. BeautifulSoup中的.text方法和get_text()方法的区别
  4. 软件设计思维:软件应该可以增大可以减小
  5. mysql数据库sql审核_Inception SQL审核注解
  6. 织梦生成栏目找不到模板怎么知道是哪个栏目和模板
  7. Quartz.NET常用方法 01
  8. 关于meta http-equiv=Content-Type content=text/html:charset=UTF-8
  9. oracle几何体数据类型,Oracle数据库之spatial操作geometry方法
  10. linux之文件和目录复制:cp
  11. C#中xml序列化域反序列化
  12. java 客户端调用 Tuxedo中间件
  13. Win10菜单栏卡顿无响应的解决方法
  14. 胡海牙和李兆生的仙逝有感
  15. Android-java.net.SocketException: Socket closed问题
  16. 利用计算机进行信息管理,浅论如何利用计算机软件技术进行信息管理
  17. Hexo全局添加APlayer音乐播放器
  18. ogg_for_bigdata (oracle 数据通过ogg到hbase)
  19. [动态规划] leetcode 416. 分割等和子集
  20. 编译时多态、运行时多态

热门文章

  1. NodeJS Stream 三:readable
  2. !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
  3. 树莓派学习路程No.2 GPIO功能初识 wiringPi安装
  4. Cygwin ssh
  5. linux系统中配置NFS实现文件共享
  6. BAT监视360进程.txt
  7. SQL、NoSQL 已过时,快升级到 NewSQL,长江后浪推进浪啊
  8. 三千万海外用户的天才程序员之死
  9. 今日头条架构演进之路
  10. 非广告,运维派送红包,参与就有!