蓝桥杯2023年第十四届省赛真题-网络稳定性(最大生成树+LCA)

  1. import java.io.*;
  2. import java.util.*;
  3. import java.math.*;
  4. //An apple a day
  5. public class Main{
  6. static int maxn = 200005,n,m,inf=(int)2e9;
  7. static long INF = (long)2e18,ans = 0,mod = (int)1e9+7;
  8. static Scanner sc = new Scanner (System.in);
  9. static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
  10. static StreamTokenizer st =new StreamTokenizer(bf);
  11. static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
  12. public static void main(String[]args) throws IOException{
  13. int T = 1;
  14. //T = I();
  15. while(T-->0) solve();
  16. pw.flush();
  17. }
  18. static final int I() throws IOException {
  19. st.nextToken();
  20. return (int)st.nval;
  21. }
  22. static class node{
  23. int to;
  24. int w;
  25. public node(int a,int b) {
  26. to=a;w=b;
  27. }
  28. }
  29. static Vector<Vector<node>> g = new Vector<>();
  30. static int f[][] = new int [100002][26];
  31. static int res[][] = new int [100002][26];
  32. static int dep[] = new int [100002];
  33. static int p[] = new int [100005];
  34. static int find(int x) {
  35. if(p[x] == x) return x;
  36. return p[x] = find(p[x]);
  37. }
  38. static void dfs(int i,int fa,int w) {
  39. f[i][0]=fa;
  40. res[i][0] = w;
  41. dep[i] = dep[fa]+1;
  42. for(int j=1;j<=22;j++) {
  43. f[i][j] = f[f[i][j-1]][j-1];
  44. res[i][j] = Math.min(res[i][j-1], res[f[i][j-1]][j-1]);
  45. }
  46. for(node x:g.get(i)) {
  47. int b=x.to;
  48. if(dep[b]==0) dfs(b,i,x.w);
  49. }
  50. }
  51. static int lca(int a,int b) {
  52. if(find(a) != find(b)) return -1;
  53. if(dep[a]>dep[b]) {
  54. int t=a;
  55. a=b;b=t;
  56. }
  57. int tmp = dep[b]-dep[a];
  58. int ans=inf;
  59. for(int i=0;tmp>0;i++,tmp/=2) {
  60. if(tmp%2>0) {
  61. ans = Math.min(ans, res[b][i]);
  62. b=f[b][i];
  63. }
  64. }
  65. if(b==a) return ans;
  66. for(int i=22;i>=0;i--) {
  67. if(f[a][i] !=f[b][i]) {
  68. ans = Math.min(ans, Math.min(res[a][i], res[b][i]));
  69. a=f[a][i];
  70. b=f[b][i];
  71. }
  72. }
  73. return Math.min(ans, Math.min(res[a][0], res[b][0]));
  74. }
  75. static class edge{
  76. int u,v,w;
  77. public edge(int a,int b,int c) {
  78. u=a;v=b;w=c;
  79. }
  80. }
  81. static Vector<edge> ed = new Vector<>();
  82. static void krus() {
  83. Collections.sort(ed,(o1,o2)->o2.w-o1.w);
  84. for(edge x:ed) {
  85. int a=x.u,b=x.v,w = x.w;
  86. int aa=find(a),bb=find(b);
  87. if(aa==bb) continue;
  88. p[aa]=bb;
  89. g.get(a).add(new node(b,w));
  90. g.get(b).add(new node(a,w));
  91. }
  92. }
  93. static void solve() throws IOException{
  94. n=I();m=I();int q=I();
  95. for(int i=0;i<=n;i++) {
  96. g.add(new Vector<>());
  97. p[i] = i;
  98. }
  99. while(m-->0) {
  100. int u=I(),v=I(),w=I();
  101. ed.add(new edge(u,v,w));
  102. }
  103. krus();
  104. for(int i=0;i<=n;i++)
  105. Arrays.fill(res[i], inf);
  106. for(int i=1;i<=n;i++) {
  107. if(find(i) == i) dfs(i,0,inf);
  108. }
  109. while(q-->0) {
  110. pw.println(lca(I(),I()));
  111. }
  112. }
  113. }
点赞(0)
 

4.8 分

7 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论