【NOIP第二轮模拟】 过路费

【问题描述】
在某个遥远的国家里,有n个城市。编号为1,2,3,…,n。
这个国家的政府修建了m条双向道路,每条道路连接着两个城市。政府规定从城市S到城市T需要收取的过路费为所经过城市之间道路长度的最大值。如:A到B长度为2,B到C长度为3,那么开车从A经过B到C需要上交的过路费为3。
佳佳是个做生意的人,需要经常开车从任意一个城市到另外一个城市,因此她需要频繁地上交过路费,由于忙于做生意,所以她无时间来寻找交过路费最低的行驶路线。然而,当她交的过路费越多她的心情就变得越糟糕。你能帮帮她吗?帮她找出从开始城市到达目的城市,最少需要上交多少过路费。
【输入】
第一行是两个整数n 和m,分别表示城市的个数以及道路的条数。
接下来m行,每行包含三个整数 a,b,w(1≤a,b≤n,0≤w≤10^9),表示a与b之间有一条长度为w的道路。
接着有一行为一个整数q,表示佳佳发出的询问个数。
再接下来q行,每一行包含两个整数S,T(1≤S,T≤n,S≠T), 表示开始城市S和目的城市T。
【输出】
输出文件共q行,每行一个整数,分别表示每个询问需要上交的最少过路费用。输入数据保证所有的城市都是连通的。
【样例】
输入
4 5
1 2 10
1 3 20
1 4 100
2 4 30
3 4 10
2
1 4
4 1
输出
20
20
【数据范围】
对于30%的数据,满足1≤ n≤1000,1≤m≤10000,1≤q≤100;
对于50%的数据,满足1≤ n≤10000,1≤m≤10000,1≤q≤10000;
对于100%的数据,满足1≤ n≤10000,1≤m≤100000,1≤q≤10000。


【分析】
其实一道包含最小生成树和LCA倍增求RMQ的水题。

先将所有的边都存入。kruskal求最小生成树。

对于每个询问,通过LCA倍增从而求得路径中最大值。

下方代码:
···cpp

include

include

include

include

using namespace std;
const int N=10010;
const int M=100010;
struct node
{
int v,c,nxt;
}edge[N<<1];
struct fff
{
int x,y,c;
}arc[M];
int n,m,tot=0;
int f[N],head[N];
bool cmp(fff x,fff y)
{
return x.c

猜你喜欢

转载自blog.csdn.net/xyc1719/article/details/81133236