就是一道LCA的应用;
不过重点(个人观点,勿喷)在于
想到这条{最长的边最小值}的路径在MST(最小生成树)上;
想到这一点之后,基本就会了。
还有第二个小问题,怎么lca求路径最大值。
(
思
考
空
间
)
ANS:蛮simple的,只要在跳lca的时候记录最大值就可以了。
代码:

1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,p;
4 struct pp
5 {
6 int to,nxt,val;
7 }e[600005];
8 struct p1
9 {
10 int x,y,z;
11 }g[300005];
12 bool cmp(p1 x,p1 y) {return x.z<y.z;}
13 int head[300005];
14 int tot;
15 int v[300005][22];
16 int dep[300005];
17 void add(int x,int y,int z)
18 {
19 e[++tot].to=y;
20 e[tot].val=z;
21 e[tot].nxt=head[x];
22 head[x]=tot;
23 }
24 int f[300005][22];
25 void dfs(int x)
26 {
27 for(int i=head[x];i;i=e[i].nxt)
28 {
29 int y=e[i].to;
30 if(y==f[x][0]) continue;
31 dep[y]=dep[x]+1;
32 f[y][0]=x;
33 v[y][0]=e[i].val;
34 dfs(y);
35 }
36 }
37 int lca(int x,int y)
38 {
39 if(dep[x]<dep[y]) swap(x,y);
40 int d=dep[x]-dep[y],res=0;
41 for(int i=0,p=1;i<20;i++,p<<=1)
42 if(d&p)
43 {
44 res=max(res,v[x][i]);
45 x=f[x][i];
46 }
47 if(x==y) return res;
48 for(int i=19;i>=0;i--)
49 {
50 if(f[x][i]==f[y][i]) continue;
51 res=max(res,v[x][i]);
52 res=max(res,v[y][i]);
53 x=f[x][i];
54 y=f[y][i];
55 }
56 return max(res,max(v[x][0],v[y][0]));
57 }
58 int fa[300005];
59 int findf(int x) {return fa[fa[x]]==fa[x]? fa[x]:fa[x]=findf(fa[x]);}
60 void krustal()
61 {
62 sort(g+1,g+m+1,cmp);
63 for(int i=1;i<=n;i++)fa[i]=i;
64 int cnt=1;
65 for(int i=1;i<=m;i++)
66 {
67 int fx=findf(g[i].x),fy=findf(g[i].y);
68 if(fx==fy)continue;
69 fa[fx]=fy;
70 add(g[i].x,g[i].y,g[i].z);
71 add(g[i].y,g[i].x,g[i].z);
72 if(++cnt==n) break;
73 }
74 }
75
76 int main()
77 {
78 memset(head,-1,sizeof(head));
79 tot=0;
80 cin>>n>>m>>p;
81 for(int i=1;i<=m;i++) scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].z);
82 krustal();
83
84 dfs(1);
85 for(int j=1;j<20;j++)
86 for(int i=1;i<=n;i++)
87 {
88 f[i][j]=f[f[i][j-1]][j-1];
89 v[i][j]=max(v[i][j-1],v[f[i][j-1]][j-1]);
90 }
91 int x,y;
92 while(p--)
93 {
94 scanf("%d%d",&x,&y);
95 printf("%d\n",lca(x,y));
96 }
97 return 0;
98 }
99 /*
100 6 6 8
101 1 2 5
102 2 3 4
103 3 4 3
104 1 4 8
105 2 5 7
106 4 6 2
107 1 2
108 1 3
109 1 4
110 2 3
111 2 4
112 5 1
113 6 2
114 6 1
115 */
