原题链接:蓝桥杯历届试题-城市建设
解题思路:虚拟点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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复