原题链接:蓝桥杯历届试题-城市建设
解题思路:虚拟点0点,当码头只有一个时最后减掉,其他就是最小生成树和并查集
注意事项:可以挣钱的路不管树通不通都加
参考代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> f;
struct eg{
int from,to,cost;
eg(int From,int To,int Cost){
from=From;
to=To;
cost=Cost;
}
};
vector<eg> e;
int findd(int x){
if(f[x]!=x)
return f[x]=findd(f[x]);
return x;
}
void unit(int x,int y){
f[findd(x)]=findd(y);//y的根作为x的根节点的父节点
}
bool one(int x,int y){
if(findd(x)==findd(y))
return true;
else return false;
}
bool comp(const eg& e1,const eg& e2){
return e1.cost<e2.cost;//从小到大
}
int main(){
int n,m,sum=0,a,b=-1,c,k=0,Cost;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a>>b>>c;
e.push_back(eg(a,b,c));
}
f.push_back(0);
for(int i=1;i<=n;i++){
cin>>a;
if(a>0)
e.push_back(eg(0,i,a));
f.push_back(i);
}
sort(e.begin(),e.end(),comp);
for(int i=0;i<e.size();i++){
if(!one(e[i].from,e[i].to)||e[i].cost<0){//不是同一个集合
unit(e[i].from,e[i].to);
sum+=e[i].cost;
if(e[i].from==0){
k++;
Cost=e[i].cost;
}
}
}
if(k!=1)
cout<<sum;
else
cout<<sum-Cost;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复