Treavelling Salesman
After leaving Yemen, Bahosain now works as a salesman in Jordan. He spends most of his time travelling
between different cities. He decided to buy a new car to help him in his job, but he has to decide about the
capacity of the fuel tank. The new car consumes one liter of fuel for each kilometer.
Each city has at least one gas station where Bahosain can refill the tank, but there are no stations on the roads
between cities.
Given the description of cities and the roads between them, find the minimum capacity for the fuel tank
needed so that Bahosain can travel between any pair of cities in at least one way.
Input
The first line of input contains T (1 ≤ T ≤ 64)that represents the number of test cases.
The first line of each test case contains two integers: N (3 ≤ N ≤ 100,000)and M (N-1 ≤ M ≤ 100,000),
where Nis the number of cities, and Mis the number of roads.
Each of the following Mlines contains three integers: X Y C (1 ≤ X, Y ≤ N)(X ≠ Y)(1 ≤ C ≤ 100,000), where
Cis the length in kilometers between city Xand city Y. Roads can be used in both ways.
It is guaranteed that each pair of cities is connected by at most one road, and one can travel between any pair
of cities using the given roads.
Output
For each test case, print a single line with the minimum needed capacity for the fuel tank.
Sample Input
2
6 7
1 2 3
2 3 3
3 1 5
3 4 4
4 5 4
4 6 3
6 5 5
3 3
1 2 1
2 3 2
3 1 3
Sample Output
4
2
题意
题目的大致意思是说有个推销员要在不同的城市之间往来(开车),但是只有每个城市才有加油站,城市之间的的路上是没有加油站的,问他的汽车的油箱至少要多大才能保证他的车不搁在路上。
解题思路
典型的求最小生成树的问题,另外输入的测试数据较大,使用cin可能会超时,建议使用scanf(对c++而言)。
代码
/*
* Travelling Salesman
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100010;
struct Edgd{
int u,v,e;
};
int Kurskal(int n,int m,Edgd &e);
int cmp(const Edgd a,const Edgd b);
int find(int x,int *p);
int Kurskal(int n,int m,Edgd *e) {
int p[maxn]={'\0'},ans=0;
for(int i=0;i<n;i++)p[i]=i;
sort(e,e+m,cmp);
for(int i=0;i<m;i++){
int x=find(e[i].u,p),y=find(e[i].v,p);
if(x!=y){
p[x]=y;
ans=max(ans,e[i].e);
}
}
return ans;
}
int cmp(const Edgd a, const Edgd b) {
return a.e<b.e;
}
int find(int x,int *p) {
return p[x]==x?x:p[x]=find(p[x],p);
}
int main(){
// freopen("in","r",stdin);
int T,n,m;
Edgd edgd[maxn];
scanf("%d",&T);
while(T--){
cin>>n>>m;
for(int i=0;i<m;i++){
scanf("%d%d%d",&edgd[i].u,&edgd[i].v,&edgd[i].e);
}
cout<<Kurskal(n,m,edgd)<<endl;
}
return 0;
}
Bahosain作为一名在Jordan的推销员,需要在不同城市间穿梭,他需决定新车油箱最小容量。每行驶一公里消耗一升油,每个城市有一个加油站。给定城市和道路信息,找出最小油箱容量,确保能从任意一对城市间往返一次。题目要求求解最小生成树,并注意输入数据量大,避免cin导致超时。
1万+

被折叠的 条评论
为什么被折叠?



