关于最小生成树算法:
算法导论–最小生成树(Kruskal和Prim算法)_勿在浮砂筑高台-CSDN博客
最小生成树之Prim(普里姆)算法_Yi_xiaoqiang的博客-CSDN博客
也是会员题。。。
自己写一写练手,没有提交
#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;//分别代表顶点个数与边数
cin >> n >> m;
//对于无向图,至少需要n-1条边才可以使得图连通
//对于有向图,至少需要n条边才可以使得图连通
if(m < n-1){
cout << -1 << endl;
return 0;
}
for(int i = 0; i < m; ++i){
for(int j = 0; j < 3; ++j) cin >> connections[i][j];
}
cout << miniumCost(n) << endl;
return 0;
}