1.练习项目 :
问题描述
蓝桥公司招聘了一个推销员。他大部分时间都在不同的城市之间旅行。他决定买一辆新车来帮助他的工作,但他必须决定新车油箱的容量。假设这辆新车每公里耗油一升。
每个城市至少有一个加油站,推销员可以在那里给油箱加油,但城市之间的道路上没有加油站。 给出城市及其之间道路的描述,找出所需油箱的最小容量,以便推销员能够至少以一种方式在任何一对城市之间旅行。
输入格式
输入的第一行包含表示测试用例数的 T。
每个测试用例的第一行包含两个整数:N 和 M ,其中 N 为城市数量,M 为道路数量。
以下 M 行都包含三个整数:X,Y,C,其中 C 是城市 X 和城市 Y 之间的长度,单位为公里。道路可以双向使用。
题目保证每对城市之间最多有一条道路相连,并且可以使用给定的道路在任意一对城市之间旅行。
输出格式
对于每个测试用例,打印一行整数表示油箱所需的最小容量。
2.选择课程
在蓝桥云课中选择题库,选择题号3322并开始练习。
3.开始练习
(1)Kruskal算法:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=1e5+10,inf=1e9;
struct Edge{
ll x,y,c;
bool operator < (const Edge &u)const{
return c<u.c;
}
};
int preN,n,m;
int root(int x){return prex=(prex==x?x:root(prex));}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
cin>>n>>m;
vector<Edge>es;
for(int i=1;i<=m;i++){
ll x,y,c;cin>>x>>y>>c;
es.push_back({x,y,c});
}
sort(es.begin(),es.end());
for(int i=1;i<=n;i++)prei=i;
ll ans=0;
for(const auto&t:es){
ll x=t.x,y=t.y,c=t.c;
if(root(x)==root(y))continue;
ans=max(ans,c);
preroot(x)=root(y);
}
cout<<ans<<'\n';
}
return 0;
}
(2)Prim算法:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=1e5+10,inf=1e9;
struct Edge{
ll x,c;
bool operator < (const Edge &u)const{
return c>u.c;
}
};
vector<Edge>gN;
ll dN,n,m;
ll prim()
{
priority_queue<Edge>pq;
pq.push({1,d1=0});
bitset<N>vis;
ll res=0;
while(pq.size()){
int x=pq.top().x;pq.pop();
if(visx)continue;
visx=true;
res=max(res,dx);
for(const auto&t:gx){
ll y=t.x,w=t.c;
if(w<dy)pq.push({y,dy=w});
}
}
return res;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++)gi.clear(),di=inf;
for(int i=1;i<=m;i++){
ll x,y,c;cin>>x>>y>>c;
gx.push_back({y,c});
gy.push_back({x,c});
}
cout<<prim()<<'\n';
}
return 0;
}
(3)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(4)练习心得:注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法 是否切换 为英语模式;语法是否错误。