3732: Network

3732: Network

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 395  Solved: 179
[Submit][Status]

Description

给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。 
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).

现在有 K个询问 (1 < = K < = 15,000)。 
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Input

第一行: N, M, K。 
第2..M+1行: 三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N). 表示X与Y之间有一条长度为D的边。 
第M+2..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Output

 对每个询问,输出最长的边最小值是多少。

Sample Input

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1

Sample Output

5
5
5
4
4
7
4
5

HINT

 

1 <= N <= 15,000 

1 <= M <= 30,000 

1 <= d_j <= 1,000,000,000 

1 <= K <= 15,000 

 

Source

 

题解:简直逗比到家啊——昨天我的程序先是TLE,但是一想这个复杂度应该不会啊,感觉不对头,于是发现了数组开小了(phile:数组开小怎么会TLE? HansBug:我哪知道= =)然后再交就WA,不停的WA,我硬是找了一个晚上的错,结果啥都没弄出来,还是那样,弃疗了,向lydsy2012要了下数据。。。今天数据到手,手工一测试,怎么测都没错?!?!然后再Submit一次一个字都没动的程序,Accept(HansBug:这。。。)。。。好了说思路——这题可以算是NOIP2013货车运输的修改+略微强化版,先是求出最小生成树(额。。我一般用并查集+kruskal),然后DFS建树,然后用倍增进行O(nlogn)的初始化,然后每次一个O(logn)地求LCA(至于路径上的最大值嘛,只要再加一个数组就行啦),就这样O(nlogn)地AC之。。。(HansBug:不过这个逗比的Judge还是害得我纠结了一晚上啊TT phile:不是和你说了嘛变量不清零有时候会跪掉。。。 HansBug:GET IT。。。)
  1 type
  2     point=^node;
  3     node=record
  4                w,g:longint;
  5                next:point;
  6     end;
  7 
  8 var
  9    i,j,k,l,m,n,t:longint;
 10    a:array[0..40000] of point;
 11    b:array[0..40000,1..3] of longint;
 12    c,f,g,h:array[0..40000] of longint;
 13    d:array[0..20,0..40000] of longint;
 14    e:array[0..20,0..40000] of longint;
 15 function getfat(x:longint):longint;inline;
 16          begin
 17               while x<>c[x] do x:=c[x];
 18               getfat:=x;
 19          end;
 20 function tog(x,y:longint):boolean;inline;
 21          begin
 22               exit(getfat(x)=getfat(y));
 23          end;
 24 procedure merge(x,y:longint);inline;
 25           begin
 26                c[getfat(x)]:=getfat(y);
 27           end;
 28 
 29 procedure add(x,y,z:longint);inline;
 30           var p:point;
 31           begin
 32                new(p);
 33                p^.g:=y;
 34                p^.w:=z;
 35                p^.next:=a[x];
 36                a[x]:=p;
 37           end;
 38 procedure swap(var x,y:longint);inline;
 39           var z:longint;
 40           begin
 41                z:=x;x:=y;y:=z;
 42           end;
 43 procedure sort(l,r:longint);inline;
 44           var i,j,x,y:longint;
 45           begin
 46                i:=l;j:=r;x:=b[(l+r) div 2,3];
 47                repeat
 48                      while b[i,3]<x do inc(i);
 49                      while b[j,3]>x do dec(j);
 50                      if i<=j then
 51                         begin
 52                              swap(b[i,1],b[j,1]);
 53                              swap(b[i,2],b[j,2]);
 54                              swap(b[i,3],b[j,3]);
 55                              inc(i);dec(j);
 56                         end;
 57                until i>j;
 58                if l<j then sort(l,j);
 59                if i<r then sort(i,r);
 60           end;
 61 procedure dfs(x:longint);inline;
 62           var p:point;
 63           begin
 64                p:=a[x];
 65                while p<>nil do
 66                      begin
 67                           if d[0,p^.g]=0 then
 68                              begin
 69                                   d[0,p^.g]:=x;
 70                                   e[0,p^.g]:=p^.w;
 71                                   c[p^.g]:=c[x]+1;
 72                                   dfs(p^.g);
 73                              end;
 74                           p:=p^.next;
 75                      end;
 76           end;
 77 function max(x,y:longint):longint;inline;
 78          begin
 79               if x>y then max:=x else max:=y;
 80          end;
 81 function fatget(x,y:longint):longint;//inline;
 82          var i:longint;
 83          begin
 84               i:=0;
 85               while y>0 do
 86                     begin
 87                          if odd(y) then x:=d[i,x];
 88                          inc(i);
 89                          y:=y div 2;
 90                     end;
 91               exit(x);
 92          end;
 93 function getmax(x,y:longint):longint;//inline;
 94          var i,j:longint;
 95          begin
 96               i:=0;j:=0;
 97               while y>0 do
 98                     begin
 99                          if odd(y) then
100                             begin
101                                  j:=max(j,e[i,x]);
102                                  x:=d[i,x];
103                             end;
104                          inc(i);
105                          y:=y div 2;
106                     end;
107               exit(j);
108          end;
109 function getcom(x,y:longint):longint;//inline;
110          var i,j,k,l:longint;
111          begin
112               if x=y then exit(x);
113               if c[x]<c[y] then swap(x,y);
114               x:=fatget(x,c[x]-c[y]);
115               if x=y then exit(x);
116               i:=20;
117               while i>=0 do
118                     begin
119                          if d[i,x]<>d[i,y] then
120                             begin
121                                  x:=d[i,x];
122                                  y:=d[i,y];
123                             end;
124                          dec(i);
125                     end;
126               exit(d[0,x]);
127          end;
128 function getpath(x,y:longint):longint;//inline;
129          var i,j,k,l:longint;
130          begin
131               l:=getcom(x,y);
132               getpath:=max(getmax(x,c[x]-c[l]),getmax(y,c[y]-c[l]));
133          end;
134 
135 begin
136      readln(n,m,t);
137      for i:=1 to n do a[i]:=nil;
138      for i:=1 to n do c[i]:=i;
139      for i:=1 to m do
140          readln(b[i,1],b[i,2],b[i,3]);
141      sort(1,m);
142      j:=1;
143      for i:=1 to n-1 do
144          begin
145               while tog(b[j,1],b[j,2]) do inc(j);
146               add(b[j,1],b[j,2],b[j,3]);
147               add(b[j,2],b[j,1],b[j,3]);
148               merge(b[j,1],b[j,2]);
149          end;
150      fillchar(d,sizeof(d),0);
151      fillchar(c,sizeof(c),0);
152      d[0,1]:=-1;
153      dfs(1);
154      d[0,1]:=0;
155      for i:=1 to 20 do
156          begin
157               for j:=1 to n do
158                   begin
159                        d[i,j]:=d[i-1,d[i-1,j]];
160                        e[i,j]:=max(e[i-1,d[i-1,j]],e[i-1,j]);
161                   end;
162          end;
163      for i:=1 to t do
164          begin
165               readln(j,k);
166               writeln(getpath(j,k));
167          end;
168 end.
169               

 

转载于:https://www.cnblogs.com/HansBug/p/4172766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android编译出现XML or text declaration not at start of entity

1、问题 运行Android项目的时候提示出现这个XML or text declaration not at start of entity 日了狗前几天都正常2、解决办法 原来是我的一个xml文件的头部有空格&#xff0c;去掉了就好了。

我的CSDN,我的编程生涯

我的CSDN&#xff0c;我的编程生涯&#xff0c;由此开始&#xff0c;加油&#xff01;

里rust怎么找蓝图_Rust错误处理

错误处理是程序开发中必不可少的一个环节&#xff0c;在Rust中&#xff0c;错误分成两个类别&#xff1a;可恢复错误和不可恢复错误。 可恢复错误&#xff1a;比如说未找到文件&#xff0c;Rust中用Result<T,E>来实现 不可恢复错误&#xff1a;比如数组访问越界&#xff…

转载牛X文章

2019独角兽企业重金招聘Python工程师标准>>> Java中有关Null的9件事&#xff1a; http://www.importnew.com/14229.html 深入理解java异常处理机制&#xff1a; http://blog.csdn.net/hguisu/article/details/6155636 Android JNI知识简介&#xff1a; http://blog.…

Android Listview中Button按钮点击事件冲突解决办法

今天做项目时&#xff0c;ListView中含有了Button组件&#xff0c;心里一早就知道肯定会有冲突&#xff0c;因为以前就遇到过&#xff0c;并解决过&#xff0c;可惜当时没有记录下来。 今天在做的时候&#xff0c;继续被这个问题郁闷了一把&#xff0c;后来解决后&#xff0c;赶…

使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

前言以前.NetCore是不内置JSON库的&#xff0c;所以大家都用Newtonsoft的JSON库&#xff0c;而且也确实挺好用的&#xff0c;不过既然官方出了标准库&#xff0c;那更方便更值得我们多用用&#xff0c;至少不用每次都nuget安装Newtonsoft.Json库了。不过日常开发使用中会有一些…

Android开发之运行客户的Demo拿不到数据

1、问题 自己照着客户的Demo写发现拿不到数据&#xff0c;很奇怪&#xff0c;检查不出哪里有问题2、思考 我自己写的东西和Demo本质上没有区别&#xff0c;但是就是拿不到数据&#xff0c;这尴尬了&#xff0c;后面发现我是在onCreate里面直接初始化然后马上调用&#xff0c;客…

C#系统开发登录窗体在MDI窗体之前显示

通常,系统运行时的启动窗体是MDI窗体,起作用的是main()函数的Application.Run(new Mdi())语句,但我们的效果是先显示登录窗体,再显示Mdi窗体。此时,如果将该句改为Application.Run(new Login()),运行时虽可出现登录窗体Login,但Mdi窗体会闪一下然后隐藏。解决办法: …

python测试之道pdf百度云_Python测试之道——笔记1

引言如果利用python做自动化测试的话&#xff0c;一些python相关的基础知识是必须要掌握的。常用的比如&#xff1a;python代码规范、变量与数据类型、运算、函数和字符串处理等。语法规范这里只介绍重点和常用的一些注意事项。在使用python编码的时候&#xff0c;我们应该严格…

libcurl实现解析(3) - libcurl对select的使用

1.前言 在本系列的前一篇文章中。介绍了libcurl对poll()的使用。參考"libcurl原理解析(2) - libcurl对poll的使用"。 本篇文章主要分析curl_poll()中对select()的封装使用。与前一篇类似&#xff0c;我们仅仅分离出与select相关的代码。 2.curl_poll函数分析 这个函数…

C#子窗体运行时无法正常最大化的解决办法

通常情况下,要是一个窗体运行时最大化,最简单的做法就是鼠标捏一下将窗体的WindowState属性设为Maximized。但要是一个窗体是MDI的子窗体的话,以上做法就失灵了!这是我们就选择用代码控制,示例代码如下: Education_Train TE = new Education_Train(); TE.MdiParent = thi…

C和指针之高级指针话题通过函数指针实现在链表中找到特定的值

1、问题 通过函数指针实现在链表中找到特定的值,这里可以是int 类型或者char *类型 思路: 整形数据自己写比较函数,字符串比较用strcmp,然后把这个函数指针传递到函数作为参数。 2、代码实现 #include <stdio.h> #include <string.h>typedef struct No…

internet访问局域网内部方法之----------路由器端口映射

很多人每天都问为什么要端口映射&#xff1f;例如:通过路由器上网的&#xff0c;网站自己可以访问&#xff0c;但是别人就不能&#xff1b;输入127.0.0.1可以访问&#xff0c;别人还是看不到&#xff1b;输入localhost可以看到&#xff0c;但是别人就是看不到&#xff0c;气人啊…

Xamarin效果第四篇之CollectionView子项右侧布局

前面基于PopupPage然后实现了手机底部弹窗;今天再次基于他从手机右侧弹出一个可以交互的窗口;直接看看最终实现的效果:右侧弹窗不是重点主角是排行榜:我还是直接使用CollectionView然后对于头像那一块还是CollectionView然后通过修改他的子项和Header模板然后旋转让子项从右侧布…

由于TempDB设置错误导致SQL Server无法重启错误的解决方案

场景&#xff1a;前几天接到一个朋友的电话&#xff0c;说他们由于将TempDB设置错误导致SQL Server无法重启&#xff0c;让我帮忙看看。他们本来是想将TempDB的文件挪动到其他路径,比如准确的脚本应该是&#xff1a; USE master GO ALTER DATABASE tempdb  MODIFY FILE (…

知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...

为什么是Python先来聊聊为什么做数据分析一定要用 Python 或 R 语言。编程语言这么多种&#xff0c; Java , PHP 都很成熟&#xff0c;但是为什么在最近热火的数据分析领域&#xff0c;很多人选择用 Python 语言&#xff1f;数据分析只是一个需求&#xff0c;理论上来讲&#x…

判断一个偶数(大于4)是不是两个素数之和

问题:编制具有如下原型的函数sushu(int n),用来判断整数n是否为素数; 而后编制主函数,任意输入一个大于4的偶数d,找出满足d=d1+d2的所有数对,其中要求d1与d2均为素数(通过调用sushu函数来判断素数)。如偶数18可以分解为11+7以及13+5;而偶数80可以分解为:43+37、61+19、…

C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记

一、各个区的介绍 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是…

.NET 6 使用 string.Create 提升字符串创建和拼接性能

本文告诉大家&#xff0c;在 dotnet 6 或更高版本的 dotnet 里&#xff0c;如何使用 string.Create 提升字符串创建和拼接的性能&#xff0c;减少拼接字符串时&#xff0c;需要额外申请的内存&#xff0c;从而减少内存回收压力本文也是跟着 Stephen Toub 大佬学性能优化系列博客…

java读取csv文件

2019独角兽企业重金招聘Python工程师标准>>> CSV其实就是COMMA SEPARATED VALUE的缩写。在开发中用Java操作csv文件有专门的的API叫javacsv.jar javacsv.jar下载地址&#xff1a; http://sourceforge.net/project/showfiles.php?group_id33066 package com.syc.tes…