[2017浙工大之江学院决赛 H] qwb与学姐(并查集,按秩合并,最小生成树,LCA)...
题目链接: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)...相关推荐
- 计算机网络鲍卫兵答案,之江浙工大之江学院1314(1)课程表校区1.doc
PAGE PAGE 1 浙江工业大学之江学院2013/2014学年(1)学期课程表汇总 1 审批 星期 班级 节次 一 二 三 四 五 P 1.2节 3.4(5)节 6.7节 8.9节 1.2节 3. ...
- 浙工大计算机学院 张晖,计算机学院(软件学院)IMUDGES新品发布会成功举办
2018年10月20日晚18点,2018年内蒙古大学优秀文化建设项目--精英开发者联盟新品发布会于内蒙古大学北校区综合楼3楼阶梯教室顺利召开,本次发布会由内蒙古大学精英学生开发者联盟举办.计算机学院( ...
- 南工大计算机学院,江南-欢迎访问湖北工业大学计算机学院官方网站
科研情况介绍(研究方向.研究课题.现正进行的科研项目) 研究方向: 计算机软件与理论. 近3年来主要个人成果.参加学术团体及社会兼职情况: 1.机械化定理证明研究综述.第一作者.软件学报. 2019 ...
- 合工大计算机学院导师詹曙,合肥工业大学计算机与信息学院导师教师师资介绍简介-△郭艳蓉...
合肥工业大学计算机与信息学院导师教师师资介绍简介-△郭艳蓉本站小编 Free考研考试/2021-04-24 个人信息 姓 名 郭艳蓉 性 别 女 出生年月 最终学位 博士 毕业学校 合肥工业大学 从事 ...
- 浙工大计算机类包含哪些专业,浙江工业大学计算机类专业培养计划
计算机类专业培养计划 一.培养目标 计算机大类本科专业设有计算机科学与技术.软件工程.网络工程.数字媒体四个本科专业,是浙江省高校中最早开设本科层次专业教育的学校之一.为了培养厚基础.宽口径.强能力. ...
- 川大计算机学院夏令营感谢,【学长学姐经验分享】海纳百川,有容乃大—四川大学夏令营经验分享...
一.个人情况 专业:三流师范类211院校人力资源管理 排名情况:2/31(参加夏令营与九推时都为此排名) 科研:大创项目A类一项.B类一项 英语:四级563,六级464 荣誉:国家励志奖学金两次 二. ...
- 双非高校浙工大,一年2项研究上Nature,校友纷纷打Call:欠一个211名头
杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 中国高校4篇论文同日登Nature ,本已不寻常. 没想到的是,这4篇入选论文中,还有一篇大气物理方面的论文,由于其主要作者和通讯作者来自 ...
- 浙江工业大学之江学院2017年第0届达内杯A题——qwb与支教
Problem A: qwb与支教 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1617 Solved: 332 [Submit][Status] ...
- 最“燃”研究生!浙工大 64 岁研究生毕业,老师称其毕业论文写的最好
点击上方"视学算法",选择"星标"公众号 重磅干货,第一时间送达 整合 | 募格学术 来源 | 中国新闻网.杭州网 "如果能重选一次,我依旧会选择 ...
- 2008年 浙工大考研计算机专业课试题C++
2008年 浙工大考研计算机专业课试题C++ 个人闲暇之余整理,可能会有许多细节问题且题目实现代码不唯一,若有需要可邮件与我交流. 一,改程序错误 1-1,计算半径为(a+b)的圆的面积 // kao ...
最新文章
- 大失所望:第一次去苹果店“享受”维修服务的经历
- irobot擦地机器人故障_自己动手修复 iRobot braava380t 电机故障
- BeautifulSoup中的.text方法和get_text()方法的区别
- 软件设计思维:软件应该可以增大可以减小
- mysql数据库sql审核_Inception SQL审核注解
- 织梦生成栏目找不到模板怎么知道是哪个栏目和模板
- Quartz.NET常用方法 01
- 关于meta http-equiv=Content-Type content=text/html:charset=UTF-8
- oracle几何体数据类型,Oracle数据库之spatial操作geometry方法
- linux之文件和目录复制:cp
- C#中xml序列化域反序列化
- java 客户端调用 Tuxedo中间件
- Win10菜单栏卡顿无响应的解决方法
- 胡海牙和李兆生的仙逝有感
- Android-java.net.SocketException: Socket closed问题
- 利用计算机进行信息管理,浅论如何利用计算机软件技术进行信息管理
- Hexo全局添加APlayer音乐播放器
- ogg_for_bigdata (oracle 数据通过ogg到hbase)
- [动态规划] leetcode 416. 分割等和子集
- 编译时多态、运行时多态