滴滴09.13笔试第二题 城市间建立桥梁问题

题目描述:D群岛由n个小岛组成,启动造桥工程,将n个岛连接起来。(感觉题目有问题,只要连通就可以,没有体现最小费用,该题目为无向图的联通问题)
输入描述:
测试用例组数:T
岛数,桥的方案数(i岛,j岛,费用),每座桥的成本阈值
2
3 3 400
1 2 200
1 3 300
2 3 500
3 3 400
1 2 500
1 3 600
2 3 700
解答:
不满足费用的桥的方案不参与计算即可
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int MAXN = 1010;
const int MAX_LEN = 1010;

int connections[MAX_LEN][3];

struct cmp
{
bool operator()(const pair<int,int>& a, const pair<int,int>& b) const
{
return a.second > b.second;//小顶堆, 距离小的优先
}
};

int miniumCost(int n){
vector<bool> visited(n+1, false);
vector<vector<pair<int, int>>> edges(n+1);
for(int i = 0; i < n; ++i){
//无向图添加两次
edges[connections[i][0]].push_back({connections[i][1], connections[i][2]});
edges[connections[i][1]].push_back({connections[i][0], connections[i][2]});
}
//小顶堆
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;
for(const auto &v : edges[1])   q.push({v});//从第一个顶点1开始加(随便取都可以)
visited[1] = true;
int res = 0, edge_cnt = 0;
while(!q.empty()){
int cur = q.top().first;
int dis = q.top().second;
q.pop();
if(!visited[cur]){//没有被访问过
visited[cur] = true;
res += dis;
++edge_cnt;//边数+1
if(edge_cnt == n-1) return res;
for(const auto &v : edges[cur]){
q.push(v);
}
}
}
return -1;
}
int main(){
int n, m,k,T;//分别代表顶点个数与边数
int a,b,c,num=0,index=0;
int ru[10000];
cin >>T;
//对于无向图,至少需要n-1条边才可以使得图连通
//对于有向图,至少需要n条边才可以使得图连通
while(T--){
cin>>n>>m>>k;
num=0;
while(m--){
cin>>a>>b>>c;
if(c<=k){
num++;
ru[index++]=a;
ru[index++]=b;
ru[index++]=c;
}
}
index=0;
for(int i = 0; i < num; ++i){
for(int j = 0; j < 3; ++j)
connections[i][j]=ru[index++];
}
if(num<n-1){
cout<<"No"<<endl;
}

else{
if(miniumCost(n)==-1)
cout<<"No";
else
cout<<"Yes"<<endl;
}
//cout << miniumCost(n) << endl;
}

return 0;
}


#滴滴##笔试题目#
全部评论

相关推荐

bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务