PTA 镖局运镖 (30分)(最小生成树)

编程入门 行业动态 更新时间:2024-10-26 16:22:22

PTA <a href=https://www.elefans.com/category/jswz/34/1693815.html style=镖局运镖 (30分)(最小生成树)"/>

PTA 镖局运镖 (30分)(最小生成树)

镖局的运镖,就是运货(类似现在的物流)。镖局每到一个新地方开展业务,都需要对运镖途中的绿林好汉进行打点。好说话的打点费就比较低,不好说话的打点费就比较高。龙门镖局现在有一趟镖请你来规划路线,已知城市的地图,你需要选择一些道路进行疏通,以便镖局可以到达任意一个城市,要求花费的银子越少越好。

输入格式:

第一行有两个数n和m,n表示有n个城市(编号从1到n),m表示有m条道路。接下来m行,每行形如“a b c”用来表示一条道路,意思是城市a到城市b连通且打点需要花费的银子数是c。

输出格式:

若通过打点能抵达所有城市,则输出最少需要花费的银子总数。若不能抵达所有的城市则输出“impossible”。

输入样例:

3 3
1 2 1
1 3 2
2 3 4

输出样例:

3

解题

最小生成树签到题,还要判断是否成一棵树,因此这里用Kruskal算法
代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;struct edge{int v1, v2, w;
};struct cmp{bool operator ()(const edge e1, const edge e2){return e1.w > e2.w;}
};int FindSet(int Set[], int x)
{if(Set[x] < 0)return x;return Set[x] = FindSet(Set, Set[x]);
}void UnionSet(int Set[], int R1, int R2)
{if(Set[R1] > Set[R2])		//R2 > R1Set[R2] += Set[R1], Set[R1] = R2;elseSet[R1] += Set[R2], Set[R2] = R1;
}bool isOneTree(int Set[], int n)		//判断是不是一棵树
{int k = FindSet(Set, 1);for (int i = 2; i <= n; i++)if(k != FindSet(Set, i))return false;return true;
}int main()
{int n, m, a, b, w;cin >> n >> m;int *Set = new int[n + 1];memset(Set, -1, (n + 1) * sizeof(int));priority_queue<edge, vector<edge>, cmp> q;for (int i = 0; i < m; i++){cin >> a >> b >> w;q.push({a, b, w});}int ans = 0;while (!q.empty()){int a = FindSet(Set, q.top().v1);int b = FindSet(Set, q.top().v2);int w = q.top().w;q.pop();if(a == b)			//如果是同一棵树上的顶点continue;UnionSet(Set, a, b);ans += w;}if(isOneTree(Set, n))cout << ans << endl;elsecout << "impossible" << endl;delete[] Set;system("pause");return 0;
}

c++最小优先队列参考:

更多推荐

PTA 镖局运镖 (30分)(最小生成树)

本文发布于:2024-02-17 11:14:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693808.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:镖局   最小   PTA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!